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

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

20.09.2010, 11:47. Показов 11728. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru