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

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

20.09.2010, 11:47. Показов 11765. Ответов 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
Ответ Создать тему
Новые блоги и статьи
YAFU@home — распределённые вычисления для математики. На CPU
Programma_Boinc 20.01.2026
YAFU@home — распределённые вычисления для математики. На CPU YAFU@home — это BOINC-проект, который занимается факторизацией больших чисел и исследованием aliquot-последовательностей. Звучит. . .
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru