Переменная excel не найдена

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

Community's user avatar

asked Sep 25, 2013 at 17:03

William's user avatar

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 Williams's user avatar

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-а(или при раннем связывании через ToolsReferences. Подробнее про это можно почитать в статье: Как из 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 при написании кодов. В довершение хотелось бы Вас обрадовать, что вписывание данной строки в начало каждого модуля можно сделать автоматическим: поставить в опциях редактора галочку: ToolsOptions-вкладка EditorRequire 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 ПКМ и выбираем “Свойства”;
  • переходим на вкладку “Безопасность”;
  • в первом окошке “Группы или пользователи” выбираем строку “Пользователи”;
  • если по какой-либо причине эта строка отсутствует, то чуть ниже нажимаем “Изменить” и в следующем окне “Добавить”;

Окно свойств папки Steam

  • в окошке “Введите имена выбираемых объектов” вбиваем имя пользователя и кликаем “Проверить имена” (имя можно брать из строки “Администраторы” либо использовать имя гостя, зарегистрированное на данном ПК);

Иллюстрация проверки имени пользователя

  • после успешной проверки имени кликаем на ОК;
  • убеждаемся, что для выбранного пользователя во всех пунктах “Разрешить” проставлены галочки и кликаем ОК;
  • дожидаемся окончания ввода всех внесенных изменений и заново запускаем игру.

Редактор реестра и Диспетчер задач в помощь

Нам не Удается Найти Данные Для Печати Excel Что Это • Вкладка поля

Также может помочь отключение автозагрузки приложения, в котором возникает ошибка «Не удается найти (файл)». Открываем Диспетчер задач (в кнопке Пуск), ЛКМ выбираем нужную программу, затем кликаем на нее ПКМ и выбираем “Отключить”.

Ошибка в редакторе локальной групповой политики

В процессе деятельности мы можем столкнуться с тем, что при запуске редактора локальной групповой политики появится окно с сообщением о том, что не найден файл gpedit.msc. Не спешим искать данный файл на своем компьютере, а вспоминаем или смотрим, какая версия Windows установлена на ПК. Если базовая или домашняя – в них редактор ЛГП просто не предусмотрен.

  • ищем другой путь, где нам не понадобятся функции редактора (они помогают легче управлять системными настройками через ввод изменений в реестр);
  • переустанавливаем ОС до корпоративной, профессиональной и другой версии, имеющей узкую специализацию.

Мы с вами рассмотрели основные пути решения проблемы, которая возникает, когда Windows сообщает о том, что «Не удается найти (файл). Проверьте, правильно ли указано имя, и повторите попытку». Надеюсь, что данная информация поможет всем, кто столкнулся с подобной ошибкой, и вы сможете эффективно её исправить.

Уместить Таблицу На Одном Листе Excel — Новости, справки, информация, советы

    Прежде всего, нужно проверить, помещается ли таблица в границы печатного листа. Для этого переключаемся в режим «Разметка страницы». Для того, чтобы это сделать кликаем по пиктограмме с одноименным названием, которая расположена на строке состояния.

[expert_bq id=»1570″]Но он подойдет только в том случае, если документ насчитывает небольшое количество строк, или для пользователя не таким важным является то, чтобы он уместился на одну страницу в длину, а достаточно будет того, что данные расположатся на площади листа в ширину. Если же вы хотите что-то уточнить, обращайтесь ко мне![/expert_bq]
Чтобы решить эту проблему, можно использовать другую функцию Excel, которая может искать нужное значение в столбце (ИНДЕКС(), ПОИСКПОЗ(), ПРОСМОТР() и другие) вместе с СОВПАД(). Последняя функция может различать регистр.
Переход в окно параметров страницы через настройки печати в Microsoft 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

Понравилась статья? Поделить с друзьями:
  • Перелистывание страниц в excel
  • Переключение регистра в word горячие клавиши
  • Перелистывание по горизонтали word как отключить
  • Переключение раскладки в word
  • Перекрытие рядов в гистограмме excel