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

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

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

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

Всем спасибо !
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.09.2010, 11:47
Ответы с готовыми решениями:

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

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

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

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

7
Частенько бываю
750 / 331 / 42
Регистрация: 20.06.2007
Сообщений: 854
20.09.2010, 14:21 2
Вот такой есть способ:
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  [ТС] 3
Vlanib, большое спасибо за вариант. Вижу что объект Шейп как рисунок используется в диаграмме для того чтобы его далее можно было экспортировать в файл. А можно каким либо другим, более простым способом сохранить в файл. Это конечно вариант, но у меня очень много страниц обрабатывается и каждый раз создавать новый объект TChart, да еще и через OLE.
0
Частенько бываю
750 / 331 / 42
Регистрация: 20.06.2007
Сообщений: 854
20.09.2010, 16:57 4
Я задавался как-то этим вопросом, но на всех форумах, в т.ч. и зарубежных нашел только такой выход.
Если найдете более простой вариант, то сообщите плз.
0
0 / 0 / 0
Регистрация: 20.09.2010
Сообщений: 23
21.09.2010, 11:41  [ТС] 5
Вот еще один вариант нашел, но не скажу что он лучше, но вариант. Делается через Буфер и паинт.
Текст:
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
Частенько бываю
750 / 331 / 42
Регистрация: 20.06.2007
Сообщений: 854
21.09.2010, 16:36 6
Скажу я вам, что запуск стороннего приложения, размещение его в памяти и взаимодействие с ним врядли будет быстрее шейпов excel
0
0 / 0 / 0
Регистрация: 28.09.2009
Сообщений: 88
22.09.2010, 08:59 7
Вот ещё вариант: 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  [ТС] 8
Всем спасибо. Использовал вариант предложенный 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
23.09.2010, 14:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.09.2010, 14:35
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru