Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/56: Рейтинг темы: голосов - 56, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 20.09.2010
Сообщений: 23

VBA. Программное сохранение рисунка в файл

20.09.2010, 11:47. Показов 11534. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем здрасти. Прошу Вас помочь мне вот в чем. Я из 1С через OLE подключаюсь к Ексель файлам и скачиваю необходимую информацию, но на некоротых листах рабочей книги вставлены рисунки. Необходимо программное обращение к коллекции изображений на листе и сохранение их по указанной директории.

Всем спасибо !
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.09.2010, 11:47
Ответы с готовыми решениями:

Сохранение Рисунка из Word в отдельный файл Рисунка
Ситуация следующая. В документе Word есть рисунок, его надо преобразовать в файл Рисунок с сохранением всего качества. Как это сделать?...

VBA Access: Программное сохранение изменений макета формы
Добрый день! Программно задаю название формы Form_Форма.Caption = "Рабочая форма" но после закрытия формы новое название не сохраняется....

Сохранение рисунка из picturebox в файл
Добрый день, имеется picturebox (230x230), на нем нарисован polygon (см. вложение) как сохранить этот полигон в битмап (не все...

7
Частенько бываю
 Аватар для Vlanib
750 / 331 / 42
Регистрация: 20.06.2007
Сообщений: 854
20.09.2010, 14:21
Вот такой есть способ:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Sub PictureExport()
Dim sTmpChartName As String, oShp As Shape
Application.ScreenUpdating = False
With ActiveSheet
    For Each oShp In .Shapes
        If oShp.Type = msoPicture Then
            Charts.Add
            ActiveChart.Location xlLocationAsObject, .Name
            Selection.Border.LineStyle = 0
            sTmpChartName = Split(ActiveChart.Name, .Name & " ")(1)
            .Shapes(sTmpChartName).Width = oShp.Width
            .Shapes(sTmpChartName).Height = oShp.Height
            .Shapes(oShp.Name).Copy
            ActiveChart.ChartArea.Select
            ActiveChart.Paste
            .ChartObjects(1).Chart.Export Filename:=ActiveWorkbook.Path & "\" & Split(ActiveWorkbook.Name, ".")(0) & "_" & oShp.Name & ".jpg", FilterName:="jpg"
            .Shapes(sTmpChartName).Cut
        End If
    Next
End With
Application.ScreenUpdating = True
End Sub
0
0 / 0 / 0
Регистрация: 20.09.2010
Сообщений: 23
20.09.2010, 15:46  [ТС]
Vlanib, большое спасибо за вариант. Вижу что объект Шейп как рисунок используется в диаграмме для того чтобы его далее можно было экспортировать в файл. А можно каким либо другим, более простым способом сохранить в файл. Это конечно вариант, но у меня очень много страниц обрабатывается и каждый раз создавать новый объект TChart, да еще и через OLE.
0
Частенько бываю
 Аватар для Vlanib
750 / 331 / 42
Регистрация: 20.06.2007
Сообщений: 854
20.09.2010, 16:57
Я задавался как-то этим вопросом, но на всех форумах, в т.ч. и зарубежных нашел только такой выход.
Если найдете более простой вариант, то сообщите плз.
0
0 / 0 / 0
Регистрация: 20.09.2010
Сообщений: 23
21.09.2010, 11:41  [ТС]
Вот еще один вариант нашел, но не скажу что он лучше, но вариант. Делается через Буфер и паинт.
Текст:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
Sub Макрос1()
With ActiveSheet
For Each oShp In .Shapes
If oShp.Type = msoPicture Then
 
oShp.Copy
Set WshShell = CreateObject("WScript.Shell")
 
'Запускаем Паинт, через буфер обмена вставляем в него рисунок
WshShell.Run ("""%systemroot%\system32\mspaint.exe """)
Success = False
  Do Until Success = True
    Success = WshShell.AppActivate("Безымянный - Paint")
    waitfor (1)
  Loop
 
waitfor (1)
WshShell.SendKeys "^{v}"
 
waitfor (1)
 
WshShell.SendKeys "^{s}"
waitfor (1)
Filename = "Pic" & Replace(Replace(Now, "/", "-"), ":", "_")
WshShell.SendKeys Filename
waitfor (1)
WshShell.SendKeys "{ENTER}"
 
'Закрываем Paint
Success = False
  Do Until Success = True
    Success = WshShell.AppActivate(Filename & " - Paint")
    waitfor (1)
  Loop
 
WshShell.SendKeys "%{F4}"
 
 
End If
Next
End With
 
    
End Sub
Sub waitfor(secunds)
    'Задержка в секундах
    newHour = Hour(Now())
    newMinute = Minute(Now())
    newSecond = Second(Now()) + secunds
    waitTime = TimeSerial(newHour, newMinute, newSecond)
    Application.Wait waitTime
End Sub
0
Частенько бываю
 Аватар для Vlanib
750 / 331 / 42
Регистрация: 20.06.2007
Сообщений: 854
21.09.2010, 16:36
Скажу я вам, что запуск стороннего приложения, размещение его в памяти и взаимодействие с ним врядли будет быстрее шейпов excel
0
0 / 0 / 0
Регистрация: 28.09.2009
Сообщений: 88
22.09.2010, 08:59
Вот ещё вариант: http://yoksel.net.ru/Ob'ektyVs... 9;Kartinki

Есть, конечно, и другие варианты (без использования Charts и SendKeys), но ссылки дать не могу, ибо они выложены на других форумах.
Но все эти варианты так или иначе используют буфер обмена.

Я обычно в таких случаях сначала копирую картинку: sha.CopyPicture xlScreen, xlBitmap
а потом использую функции типа GetClipPicture (наберите название этой функции в Яндексе)
0
0 / 0 / 0
Регистрация: 20.09.2010
Сообщений: 23
23.09.2010, 14:35  [ТС]
Всем спасибо. Использовал вариант предложенный Vlanib. Так как программное обращение было из 1С, выкладываю код, мало ли у кого будет подобная ситуация.
Примерно следующее:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Ексель = СоздатьОбъект("Excel.Application");
Книга=Ексель.WorkBooks.Open(ПутьКФайлу);
ФлагСозданияНовогоЛиста=1;
Для н=1 По 10 Цикл
        Для г=1 По Ексель.ActiveWorkbook.Worksheets("Вопрос"+н).Shapes.Count Цикл
            Если Ексель.ActiveWorkbook.Worksheets("Вопрос"+н).Shapes.Item(г).Type=13 Тогда //Рисунок
                
                Если ФлагСозданияНовогоЛиста=0 Тогда
                    НовыйЛист=Ексель.ActiveWorkbook.Worksheets.Add();
                    НовыйЛист.Name="ForExport";
                    ФлагСозданияНовогоЛиста=1;
                КонецЕсли;
                
                Ексель.Charts.Add();
                Ексель.ActiveChart.Location(2, "ForExport");
                
                ВсегоФигурНаЛисте=Ексель.ActiveWorkbook.Worksheets("ForExport").Shapes.Count();
                Ексель.ActiveWorkbook.Worksheets("ForExport").Shapes(ВсегоФигурНаЛисте).Width=Ексель.ActiveWorkbook.Worksheets("Вопрос"+н).Shapes.Item(г).Width;
                Ексель.ActiveWorkbook.Worksheets("ForExport").Shapes(ВсегоФигурНаЛисте).Height=Ексель.ActiveWorkbook.Worksheets("Вопрос"+н).Shapes.Item(г).Height;
                Ексель.ActiveWorkbook.Worksheets("Вопрос"+н).Shapes.Item(г).Copy();
                Ексель.ActiveChart.ChartArea.Select();
                Ексель.ActiveChart.Paste();
                ВсегоОбъектовДиаграммы=Ексель.ActiveWorkbook.Worksheets("ForExport").ChartObjects.Count();
                
                Если ФС.СуществуетФайл(КаталогИБ()+"ExtForms\Изображения")=0 Тогда
                    ФС.СоздатьКаталог(КаталогИБ()+"ExtForms\Изображения");
                КонецЕсли;
                
                Ексель.ActiveWorkbook.Worksheets("ForExport").ChartObjects(ВсегоОбъектовДиаграммы).Chart.Export(КаталогИБ()+"ExtForms\Изображения\"+Ексель.ActiveWorkbook.Name+"_Вопрос_"+н+".jpg", "jpg");
                СпрВопросы.ФайлИзображения=Ексель.ActiveWorkbook.Name+"_Вопрос_"+н+".jpg";
            КонецЕсли;
        КонецЦикла;
КонецЦикла;
Книга.Close(0);
P.S. Создавал Чарты на отдельном листе. По сути объект Чарт можно было создать только один и далее перезаливать в него новое изображение
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.09.2010, 14:35
Помогаю со студенческими работами здесь

Сохранение рисунка в буфер обмена и в файл
Привет! Подскажите, пожалуйста, как сохранить изображенное на TImage в файл и буфер обмена. Чтобы можно было вставлять в Word.

Сохранение орнамента(рисунка) StringGrid в файл(если это возможно)
Создал рисовалку(всё рисуется в StringGrid).Как сохранить нарисованный рисунок?

Сохранение файл в другой папке VBA
Добрый день! Проблема состоит в том, что есть файл предположим на рабочем столе, мне нужно сохранить его в другой папке с помощью макроса...

Сохранение рисунка
Добрый день! Помогите, пожалуйста. Пользователь нажатием на кнопки рисует на panel квадраты и закрашивает их в разных частях panel....

Сохранение рисунка
Рисую графики из кода. Линиями по Гриду. // ... Polyline line = new Polyline(); line.Points.Add(point); // ... ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Основы WebGL. Раскрашивание вершин с помощью VBO
8Observer8 05.07.2025
На русском https:/ / vkvideo. ru/ video-231374465_456239020 На английском https:/ / www. youtube. com/ watch?v=oskqtCrWns0 Исходники примера:
Мониторинг микросервисов с OpenTelemetry в Kubernetes
Mr. Docker 04.07.2025
Проблема наблюдаемости (observability) в Kubernetes - это не просто вопрос сбора логов или метрик. Это целый комплекс вызовов, которые возникают из-за самой природы контейнеризации и оркестрации. К. . .
Проблемы с Kotlin и Wasm при создании игры
GameUnited 03.07.2025
В современном мире разработки игр выбор технологии - это зачастую балансирование между удобством разработки, переносимостью и производительностью. Когда я решил создать свою первую веб-игру, мой. . .
Создаем микросервисы с Go и Kubernetes
golander 02.07.2025
Когда я только начинал с микросервисами, все спорили о том, какой язык юзать. Сейчас Go (или Golang) фактически захватил эту нишу. И вот почему этот язык настолько заходит для этих задач: . . .
C++23, квантовые вычисления и взаимодействие с Q#
bytestream 02.07.2025
Я всегда с некоторым скептицизмом относился к громким заявлениям о революциях в IT, но квантовые вычисления - это тот случай, когда революция действительно происходит прямо у нас на глазах. Последние. . .
Вот в чем сила LM.
Hrethgir 02.07.2025
как на английском будет “обслуживание“ Слово «обслуживание» на английском языке может переводиться несколькими способами в зависимости от контекста: * **Service** — самый распространённый. . .
Использование Keycloak со Spring Boot и интеграция Identity Provider
Javaican 01.07.2025
Два года назад я получил задачу, которая сначала показалась тривиальной: интегрировать корпоративную аутентификацию в микросервисную архитектуру. На тот момент у нас было семь Spring Boot приложений,. . .
Содержание темы с примерами на WebGL
8Observer8 01.07.2025
Все примеры из книги Мацуды и Ли в песочнице JSFiddle Пример выводит точку красного цвета размером 10 пикселей на WebGL 1. 0 и 2. 0 WebGL 1. 0. Передача координаты точки из главной программы в. . .
Основы WebGL. Простой треугольник
8Observer8 01.07.2025
Простой треугольник без трансформаций. Для трансформаций можно использовать glMatrix, как в примере: https:/ / plnkr. co/ edit/ qT6ZTwvncLPRamK5?preview На русском: . . .
Полиглотные микросервисы на C# и .NET
ArchitectMsa 30.06.2025
Полиглотная архитектура появилась не из желания усложнить жизнь разработчикам. Она родилась из практической необходимости решать разные задачи наиболее эффективным способом. В одном из проектов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru