My code is supposed to export a picture, ranges and text boxes from Excel to PowerPoint. I am getting an error though where it’s supposed to paste the ranges as bitmap. The error states that a variable is not found. I am new to VBA and needs some assistance if possible.
Here is the code I am using:
Option Explicit
Dim PPApp As PowerPoint.Application
Dim PPPres As PowerPoint.Presentation
Dim PPSlide As PowerPoint.Slide
Sub copy_to_ppt()
Dim wsname As String
Dim Shapes As Shape
Dim Range As Range
Dim a, b As Integer
Set PPApp = New PowerPoint.Application
PPApp.Visible = True
Set PPPres = PPApp.Presentations.Open("C:UsersgdjwherrDesktopBrazil ReportsTRP FileTRP Test Template.pptx")
Sheets("Sheet1").Select
'-----------------------------
ActiveSheet.Shapes("Picture 1").Select
Selection.Copy
Set PPSlide = PPPres.Slides _
(PPApp.ActiveWindow.Selection.SlideRange.SlideIndex)
PPApp.ActiveWindow.ViewType = ppViewSlide
PPSlide.Shapes.PasteSpecial(ppPasteJPG).Select
PPApp.ActiveWindow.Selection.ShapeRange(1).Top = PPApp.ActiveWindow.Selection.ShapeRange(1).Top + 60
PPApp.ActiveWindow.Selection.ShapeRange(1).Left = PPApp.ActiveWindow.Selection.ShapeRange(1).Left + 20
ActiveSheet.Range("D3:E8").Select
Selection.Copy
Set PPSlide = PPPres.Slides _
(PPApp.ActiveWindow.Selection.SlideRange.SlideIndex)
PPApp.ActiveWindow.ViewType = ppViewSlide
Selection.PasteSpecial DataType:=wdPasteBitmap ```This is where the error occurs stating variable not defined and highlights wdPasteBitmap
PPApp.ActiveWindow.Selection.ShapeRange(1).Top = PPApp.ActiveWindow.Selection.ShapeRange(1).Top + 60
PPApp.ActiveWindow.Selection.ShapeRange(1).Left = PPApp.ActiveWindow.Selection.ShapeRange(1).Left + 0
ActiveSheet.Range("G3:H8").Select
Selection.Copy
Set PPSlide = PPPres.Slides _
(PPApp.ActiveWindow.Selection.SlideRange.SlideIndex)
PPApp.ActiveWindow.ViewType = ppViewSlide
Selection.PasteSpecial DataType:=wdPasteBitmap
PPApp.ActiveWindow.Selection.ShapeRange(1).Top = PPApp.ActiveWindow.Selection.ShapeRange(1).Top + 60
PPApp.ActiveWindow.Selection.ShapeRange(1).Left = PPApp.ActiveWindow.Selection.ShapeRange(1).Left - 20
Set PPSlide = Nothing
Set PPPres = Nothing
Set PPApp = Nothing
End Sub
asked Sep 25, 2013 at 17:03
6
A little bit of refactoring…
Sub copy_to_ppt()
Dim PPApp As PowerPoint.Application
Dim PPPres As PowerPoint.Presentation
Dim ppSlide As PowerPoint.Slide
Dim wsname As String
'Dim Shapes As Shape 'don't do this!
'Dim Range As Range 'don't do this!
Dim a, b As Integer
Dim oLayout
Set PPApp = New PowerPoint.Application
PPApp.Visible = True
Set PPPres = PPApp.Presentations.Open("C:UsersgdjwherrDesktopBrazil ReportsTRP FileTRP Test Template.pptx")
PPApp.ActiveWindow.ViewType = ppViewSlide
Set ppSlide = PPPres.Slides _
(PPApp.ActiveWindow.Selection.SlideRange.SlideIndex)
Sheets("Sheet1").Shapes("Picture 1").Copy
PP_Paste ppSlide, ppPasteJPG, 100, 100
Sheets("Sheet1").Range("D3:E8").Copy
PP_Paste ppSlide, ppPasteBitmap, 100, 300
Sheets("Sheet1").Range("G3:H8").Copy
PP_Paste ppSlide, ppPasteBitmap, 100, 500
Set ppSlide = Nothing
Set PPPres = Nothing
Set PPApp = Nothing
End Sub
Sub PP_Paste(ppSlide As PowerPoint.Slide, fmt, posTop, posLeft)
With ppSlide.Shapes.PasteSpecial(fmt)
.Top = posTop
.Left = posLeft
End With
End Sub
answered Sep 25, 2013 at 18:34
Tim WilliamsTim Williams
150k8 gold badges96 silver badges124 bronze badges
3
Хитрости »
1 Май 2011 51632 просмотров
Option Explicit — начинающие программировать в Visual Basic могут увидеть данную строку в чужом коде, либо случайно в своем. Хотя кто-то может быть уже знает, что это и зачем и использует данное объявление намеренно. Я же постараюсь максимально подробно описать смысл этой строки и её полезность для кода в первую очередь для тех, кто еще не знает для чего она.
Строка данная записывается в самом начале модуля, самой первой строкой. Перед этой строкой ничего более не может быть записано, кроме, разве что других подобных строк(есть еще другие :-))
Собственно что же делает эта строка? А делает она следующее: она принуждает Вас объявлять переменные(если не знаете смысл объявления переменных — читайте здесь). Если какая-либо переменная внутри выполняемой процедуры не объявлена — Вы увидите такое вот сообщение:
рис.1
так же редактор VBA выделит ту переменную, которая не объявлена. Первое время это может раздражать. Да и вообще: зачем это? Вы и без всех этих объявлений неплохо жили. А вот зачем
- во-первых: объявление переменных считается хорошим тоном при программировании
- во-вторых: правильное присвоение типов недурно экономит память
- ну и в-третьих(я бы даже сказал в главных): это помогает избежать неявных ошибок кода при несовпадении типов данных
А теперь перейдем к сути и попробуем разобраться в чем же польза от использования Option Explicit. Ниже приведен простой код:
Sub Check_Variables() Dim a As String a = "Привет от www.excel-vba.ru" MsgBox а, vbInformation End Sub
Выполните данный код без строки Option Explicit. Какое значение выдаст MsgBox? Ничего. Что за странность? Ведь явно видно, что переменной присвоено значение текста. Ничего больше не происходит. Но переменная все равно пуста. Мистика…А теперь запишите первой строкой в модуле Option Explicit:
Option Explicit Sub Check_Variables() Dim a As String a = "Привет от www.excel-vba.ru" MsgBox а, vbInformation End Sub
Запустите код. И что же видите? Видите сообщение, показанное на рис.1 и выделенную переменную «а», в последней строке. Что это означает? Это означает, что переменная «а» у нас не объявлена. А все потому, что первой строкой (Dim a As String) я объявил переменную на английском языке, а в последней строке я записал её на русском. А для кода это разные символы. Если разглядеть логику работы VBA — первую «а» он видит как переменную с присвоенным типом String. И ей мы задаем значение «Привет от www.excel-vba.ru». А вторую…Вторую он не находит в объявленных переменных, не находит в функциях и сам инициализирует её как новую переменную с типом данных Variant. И, что вполне логично, со значением Empty, т.е. ничего, т.к. этой переменной мы никаких значений не присваивали.
Еще один классический пример, когда Option Explicit спасет от лишних мозговых штурмов. Имеем простую функцию пользователя(UDF), которая берет указанную дату и возвращает её в заранее заданном формате в текстовом виде:
Function GetDateAsText(Optional ByVal Дата As Date) If Дата = 0 Then Дата = Date End If GetDataAsText = Format(Дата, "DD MMMM YYYY") End Function
Хоть функция и короткая, но даже в ней не сразу порой бросается в глаза опечатка(представим, если функция в реальности строк на 200). В итоге чаще всего автор функции не понимает, почему при записи её на листе она возвращает не дату вида «21 мая 2016», а 0 и начинает пошагово выполнять функцию, искать ошибки в логике кода и т.д. Но если поставить в начало модуля Option Explicit, то при первом же выполнении этой функции VBA подсветит нам «GetDataAsText = «, указывая тем самым, что GetDataAsText в чем-то отличается от заданного имени функции — GetDateAsText. Банальная опечатка: GetDataAsText — GetDateAsText.
А теперь представьте себе, что Вы написали кучу длинного кода, строк на 100 или более. Конечно, Option Explicit Вы не используете. И вот Вы тестируете код, но он работает как-то не так…Где-то что-то неверно выполняется. И Вы начинаете пошагово ковыряться в листинге и искать ошибку…А ведь все может быть и проще: где-то в коде Вы могли банально опечататься и присвоить таким образом значение переменной, на которую Вы и не рассчитывали. А если использовать Option Explicit, то такая опечатка будет сразу обнаружена еще до выполнения кода и, что немаловажно — подсвечена. Так что Вам даже не придется её искать, а останется лишь исправить ошибку.
Так же эта строка поможет избежать неявных ошибок и в других ситуациях. В частности, при обращении к другим приложениями(Word, Outlook и т.д.). Например, в Excel применяются именованные константы для многих задач. Одна из распространенных — поиск последней ячейки в столбце: llast = Cells(Rows.Count, 1).End(xlUp).Row
здесь xlUp является именованной константой, значение которой равно числу: -4162. В других приложениях такой же подход. Это избавляет от необходимости помнить на память все значения констант и обращаться к ним при помощи intellisense. Но действуют эти константы исключительно внутри своего приложения(можете обратить внимание, у Excel константы начинаются с xl, а у Word — с wd). И т.к. объявлены эти константы в других приложениях — Excel про них не знает(как и другие приложения не знают про константы Excel). Для примера возьмем простой и рабочий код замены в Word:
Dim wdDoc As Object Set wdDoc = objWordApp.ActiveDocument With wdDoc.Range.Find .Text = "привет" .Replacement.Text = "привет" .wrap = wdFindContinue .Execute Replace:=wdReplaceAll End With
Где wdFindContinue для Word-а равно 1, а wdReplaceAll = 2. Но это происходит только при выполнении изнутри самого Word-а(или при раннем связывании через Tools —References. Подробнее про это можно почитать в статье: Как из Excel обратиться к другому приложению).
Если же скопировать и выполнять данный код из Excel, то работать он будет не так как задумали. Дело в том, что Вы считаете, что Excel работает с обозначенными константами(wdFindContinue, wdReplaceAll) наравне с Word-ом. Но Excel на самом деле про них ничего не знает. И если директива Option Explicit будет отключена, то Excel просто назначает им значение по умолчанию — Empty. Которое преобразуется в 0. А это совсем иной поиск получается, т.к. должны быть значения 1 и 2. А если бы Option Explicit была включена, то Excel выделил бы их и указал, что они не объявлены. И тогда можно было бы сделать либо так:
Dim wdDoc As Object Const wdFindContinue As Long = 1 Const wdReplaceAll As Long = 2 Set wdDoc = objWordApp.ActiveDocument With wdDoc.Range.Find .Text = "привет" .Replacement.Text = "привет" .wrap = wdFindContinue .Execute Replace:=wdReplaceAll End With
либо так(что удобнее, на мой взгляд):
Dim wdDoc As Object Set wdDoc = objWordApp.ActiveDocument With wdDoc.Range.Find .Text = "привет" .Replacement.Text = "привет" .wrap = 1 .Execute Replace:=2 End With
Так что думаю, не стоит недооценивать значимость строки Option Explicit при написании кодов. В довершение хотелось бы Вас обрадовать, что вписывание данной строки в начало каждого модуля можно сделать автоматическим: поставить в опциях редактора галочку: Tools—Options-вкладка Editor—Require Variable Declaration. Теперь во всех новых созданных модулях строка Option Explicit будет создаваться самим редактором VBA автоматически. К сожалению, в уже имеющихся модулях Вам придется проставить данную строку самим вручную. Но это того стоит, поверьте.
Так же см.:
Что такое переменная и как правильно её объявить?
Статья помогла? Поделись ссылкой с друзьями!
Видеоуроки
Поиск по меткам
Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика
Не удается найти (файл). Проверьте, правильно ли указано имя, и повторите попытку. Решение
Почему не обнаруживается файл
Давайте разберемся, почему на экране нашего компьютера отображается сообщение о том, что не найден файл, и нам нужно проверить имя. Система в скобках указывает путь к файлу, который не получается обнаружить, и советует нам проверить, правильно ли указано имя, и повторить попытку.
Решение проблемы при невозможности открытия exe-файлов
Существует несколько способов решения проблемы открытия exe-файлов. Рассмотрим их по порядку.
Переустановка софта
Если файл удален антивирусной программой, то нет никакой необходимости вытаскивать его из хранилища, не зря же он был туда перемещен. Даже если мы сможем достать его оттуда, он уже поврежден и не сможет функционировать так, как нужно.
В этом случае выход – полная деинсталляция и установка программы, которая не может запуститься. Удалять софт лучше всего не через стандартные средства Windows, а при помощи специального программного обеспечения – Revo Uninstaller либо AIDA64. Они не только деинсталлируют проблемную программу, но и “подчистят” все ненужные остаточные файлы.
Изменение настроек Steam
Бывает, что сообщение о невозможности открыть определенный exe-файл «Не удается найти … Проверьте, правильно ли указано имя, и повторите попытку» появляется при запуске игры. В этом случае применяем следующий алгоритм действий:
- Кликаем на папке Steam ПКМ и выбираем “Свойства”;
- переходим на вкладку “Безопасность”;
- в первом окошке “Группы или пользователи” выбираем строку “Пользователи”;
- если по какой-либо причине эта строка отсутствует, то чуть ниже нажимаем “Изменить” и в следующем окне “Добавить”;
- в окошке “Введите имена выбираемых объектов” вбиваем имя пользователя и кликаем “Проверить имена” (имя можно брать из строки “Администраторы” либо использовать имя гостя, зарегистрированное на данном ПК);
- после успешной проверки имени кликаем на ОК;
- убеждаемся, что для выбранного пользователя во всех пунктах “Разрешить” проставлены галочки и кликаем ОК;
- дожидаемся окончания ввода всех внесенных изменений и заново запускаем игру.
Редактор реестра и Диспетчер задач в помощь
Также может помочь отключение автозагрузки приложения, в котором возникает ошибка «Не удается найти (файл)». Открываем Диспетчер задач (в кнопке Пуск), ЛКМ выбираем нужную программу, затем кликаем на нее ПКМ и выбираем “Отключить”.
Ошибка в редакторе локальной групповой политики
В процессе деятельности мы можем столкнуться с тем, что при запуске редактора локальной групповой политики появится окно с сообщением о том, что не найден файл gpedit.msc. Не спешим искать данный файл на своем компьютере, а вспоминаем или смотрим, какая версия Windows установлена на ПК. Если базовая или домашняя – в них редактор ЛГП просто не предусмотрен.
- ищем другой путь, где нам не понадобятся функции редактора (они помогают легче управлять системными настройками через ввод изменений в реестр);
- переустанавливаем ОС до корпоративной, профессиональной и другой версии, имеющей узкую специализацию.
Мы с вами рассмотрели основные пути решения проблемы, которая возникает, когда Windows сообщает о том, что «Не удается найти (файл). Проверьте, правильно ли указано имя, и повторите попытку». Надеюсь, что данная информация поможет всем, кто столкнулся с подобной ошибкой, и вы сможете эффективно её исправить.
Уместить Таблицу На Одном Листе Excel — Новости, справки, информация, советы
-
Прежде всего, нужно проверить, помещается ли таблица в границы печатного листа. Для этого переключаемся в режим «Разметка страницы». Для того, чтобы это сделать кликаем по пиктограмме с одноименным названием, которая расположена на строке состояния.
[expert_bq id=»1570″]Но он подойдет только в том случае, если документ насчитывает небольшое количество строк, или для пользователя не таким важным является то, чтобы он уместился на одну страницу в длину, а достаточно будет того, что данные расположатся на площади листа в ширину. Если же вы хотите что-то уточнить, обращайтесь ко мне![/expert_bq]
Чтобы решить эту проблему, можно использовать другую функцию Excel, которая может искать нужное значение в столбце (ИНДЕКС(), ПОИСКПОЗ(), ПРОСМОТР() и другие) вместе с СОВПАД(). Последняя функция может различать регистр.
Почему не работает ВПР в Excel? | Mister-Office
- Кликаем на папке Steam ПКМ и выбираем “Свойства”;
- переходим на вкладку “Безопасность”;
- в первом окошке “Группы или пользователи” выбираем строку “Пользователи”;
- если по какой-либо причине эта строка отсутствует, то чуть ниже нажимаем “Изменить” и в следующем окне “Добавить”;
Если несовпадение форматов встречается редко, то можно просто исправить формат записи данных. Измените формат ячейки на текстовый и пересохраните ее содержание (F2 и затем ENTER). Содержимое будет преобразовано в текст.
Мой код должен экспортировать изображение, диапазоны и текстовые поля из Excel в PowerPoint. Я получаю сообщение об ошибке там, где предполагается вставить диапазоны как растровое изображение. В сообщении об ошибке указано, что переменная не найдена. Я новичок в VBA и, если возможно, мне нужна помощь.
Вот код, который я использую:
Option Explicit
Dim PPApp As PowerPoint.Application
Dim PPPres As PowerPoint.Presentation
Dim PPSlide As PowerPoint.Slide
Sub copy_to_ppt()
Dim wsname As String
Dim Shapes As Shape
Dim Range As Range
Dim a, b As Integer
Set PPApp = New PowerPoint.Application
PPApp.Visible = True
Set PPPres = PPApp.Presentations.Open("C:UsersgdjwherrDesktopBrazil ReportsTRP FileTRP Test Template.pptx")
Sheets("Sheet1").Select
'-----------------------------
ActiveSheet.Shapes("Picture 1").Select
Selection.Copy
Set PPSlide = PPPres.Slides _
(PPApp.ActiveWindow.Selection.SlideRange.SlideIndex)
PPApp.ActiveWindow.ViewType = ppViewSlide
PPSlide.Shapes.PasteSpecial(ppPasteJPG).Select
PPApp.ActiveWindow.Selection.ShapeRange(1).Top = PPApp.ActiveWindow.Selection.ShapeRange(1).Top + 60
PPApp.ActiveWindow.Selection.ShapeRange(1).Left = PPApp.ActiveWindow.Selection.ShapeRange(1).Left + 20
ActiveSheet.Range("D3:E8").Select
Selection.Copy
Set PPSlide = PPPres.Slides _
(PPApp.ActiveWindow.Selection.SlideRange.SlideIndex)
PPApp.ActiveWindow.ViewType = ppViewSlide
Selection.PasteSpecial DataType:=wdPasteBitmap ```This is where the error occurs stating variable not defined and highlights wdPasteBitmap
PPApp.ActiveWindow.Selection.ShapeRange(1).Top = PPApp.ActiveWindow.Selection.ShapeRange(1).Top + 60
PPApp.ActiveWindow.Selection.ShapeRange(1).Left = PPApp.ActiveWindow.Selection.ShapeRange(1).Left + 0
ActiveSheet.Range("G3:H8").Select
Selection.Copy
Set PPSlide = PPPres.Slides _
(PPApp.ActiveWindow.Selection.SlideRange.SlideIndex)
PPApp.ActiveWindow.ViewType = ppViewSlide
Selection.PasteSpecial DataType:=wdPasteBitmap
PPApp.ActiveWindow.Selection.ShapeRange(1).Top = PPApp.ActiveWindow.Selection.ShapeRange(1).Top + 60
PPApp.ActiveWindow.Selection.ShapeRange(1).Left = PPApp.ActiveWindow.Selection.ShapeRange(1).Left - 20
Set PPSlide = Nothing
Set PPPres = Nothing
Set PPApp = Nothing
End Sub
1 ответ
Лучший ответ
Немного рефакторинга …
Sub copy_to_ppt()
Dim PPApp As PowerPoint.Application
Dim PPPres As PowerPoint.Presentation
Dim ppSlide As PowerPoint.Slide
Dim wsname As String
'Dim Shapes As Shape 'don't do this!
'Dim Range As Range 'don't do this!
Dim a, b As Integer
Dim oLayout
Set PPApp = New PowerPoint.Application
PPApp.Visible = True
Set PPPres = PPApp.Presentations.Open("C:UsersgdjwherrDesktopBrazil ReportsTRP FileTRP Test Template.pptx")
PPApp.ActiveWindow.ViewType = ppViewSlide
Set ppSlide = PPPres.Slides _
(PPApp.ActiveWindow.Selection.SlideRange.SlideIndex)
Sheets("Sheet1").Shapes("Picture 1").Copy
PP_Paste ppSlide, ppPasteJPG, 100, 100
Sheets("Sheet1").Range("D3:E8").Copy
PP_Paste ppSlide, ppPasteBitmap, 100, 300
Sheets("Sheet1").Range("G3:H8").Copy
PP_Paste ppSlide, ppPasteBitmap, 100, 500
Set ppSlide = Nothing
Set PPPres = Nothing
Set PPApp = Nothing
End Sub
Sub PP_Paste(ppSlide As PowerPoint.Slide, fmt, posTop, posLeft)
With ppSlide.Shapes.PasteSpecial(fmt)
.Top = posTop
.Left = posLeft
End With
End Sub
0
Tim Williams
26 Сен 2013 в 00:55
Hi I develop the first time using VBA (Was using vb.net etc. before).
I always get the error
Variable is not defined
when running the code.
On calling the method writeHeaders
the program always quits.
Some help would be highly appreciated, this thing drives me nuts atm.
Option Explicit
Sub exportToAPplus()
Dim applusImport As Workbook
Set applusImport = createFile
writeHeaders applusImport
End Sub
Function createFile() As Workbook
Dim dateiName As String
dateiName = Application.GetSaveAsFilename()
If dateiName <> "Falsch" And dateiName <> "False" Then
Dim applusImport As Workbook
dateiName = dateiName + "xlsx"
Set applusImport = Workbooks.Add
Application.DisplayAlerts = False
applusImport.SaveAs dateiName, FileFormat:=xlOpenXMLWorkbook
Application.DisplayAlerts = True
Set createFile = applusImport
Else
MsgBox ("Sie haben keinen Dateinamen ausgewählt, es wurde nichts
gespeichert.")
End If
End Function
Sub writeHeaders(applusImport As Workbook)
Dim headers() As Variant
headers() = Array("DATUM", "AUFTRAG", "PERSONAL", "KSTR", "INNENAUFTRAG", "POSITION", "AG", "KAPAST", "MASCHINENGRUPPE", "START", "ENDE", "DAUER", "BESCHREIBUNG")
Application.ScreenUpdating = False
For i = LBound(headers()) To UBound(headers()) Step 1
.Cells(1, 1 + i).Value = headers(i)
Next i
applusImport.Save
Application.ScreenUpdating = True
End Sub