Remkomplekty.ru

IT Новости из мира ПК
4 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Excel sub or function not defined

Thread: Solved: Compile error: sub or function not defined

Thread Tools
Display
  • Linear Mode
  • Switch to Hybrid Mode
  • Switch to Threaded Mode

Solved: Compile error: sub or function not defined

Hi,
I have a code that exports sheet to a text file and it works fine on my home pc with excel 2007.
when i run it on my work pc i get the above error, both in excel 2003 and 2007.
i found few posts in google about this issue but so far none of these helped me.
this is the first part of the code where i get the error:

[VBA]Sub DoTheExport()
Dim FileName As Variant
Dim Sep As String
FileName = Application.GetSaveAsFilename(InitialFileName:=vbNullString, FileFilter:=»Text Files (*.txt),*.txt»)
If FileName = False Then
»»»»»»»»»»»»»
‘ user cancelled, get out
»»»»»»»»»»»»»
Exit Sub
End If
Sep = Application.InputBox(«Enter a separator character.», Type:=2)
If Sep = vbNullString Then
»»»»»»»»»»»»»
‘ user cancelled, get out
»»»»»»»»»»»»»
Exit Sub
End If
Debug.Print «FileName: » & FileName, «Separator: » & Sep
ExportToTextFile FName:=CStr(FileName), Sep:=CStr(Sep), _
SelectionOnly:=False, AppendData:=False
End Sub[/VBA]

____________________________________________
Nihil simul inventum est et perfectum

Abusus non tollit usum

Last night I dreamed of a small consolation enjoyed only by the blind: Nobody knows the trouble I’ve not seen!
James Thurber

____________________________________________
Nihil simul inventum est et perfectum

Abusus non tollit usum

Last night I dreamed of a small consolation enjoyed only by the blind: Nobody knows the trouble I’ve not seen!
James Thurber

this is the second part of the code..

thnx for the fast reply.
i did copy it from the cpearson site i just couldnt attach the link.
like i mentioned i run this code on my pc without any issue, only
in the transfer to my work pc something goes wrong.

[VBA]Public Sub ExportToTextFile(FName As String, _
Sep As String, SelectionOnly As Boolean, _
AppendData As Boolean)
Dim WholeLine As String
Dim FNum As Integer
Dim RowNdx As Long
Dim ColNdx As Integer
Dim StartRow As Long
Dim EndRow As Long
Dim StartCol As Integer
Dim EndCol As Integer
Dim CellValue As String
Application.ScreenUpdating = False
On Error GoTo EndMacro:
FNum = FreeFile
If SelectionOnly = True Then
With Selection
StartRow = .Cells(1).Row
StartCol = .Cells(1).Column
EndRow = .Cells(.Cells.Count).Row
EndCol = .Cells(.Cells.Count).Column
End With
Else
With ActiveSheet.UsedRange
StartRow = .Cells(1).Row
StartCol = .Cells(1).Column
EndRow = .Cells(.Cells.Count).Row
EndCol = .Cells(.Cells.Count).Column
End With
End If
If AppendData = True Then
Open FName For Append Access Write As #FNum
Else
Open FName For Output Access Write As #FNum
End If
For RowNdx = StartRow To EndRow
WholeLine = «»
For ColNdx = StartCol To EndCol
If Cells(RowNdx, ColNdx).Value = «» Then
CellValue = Chr(34) & Chr(34)
Else
CellValue = Cells(RowNdx, ColNdx).Value
End If
WholeLine = WholeLine & CellValue & Sep
Next ColNdx
WholeLine = Left(WholeLine, Len(WholeLine) — Len(Sep))
Print #FNum, WholeLine
Next RowNdx
EndMacro:
On Error GoTo 0
Application.ScreenUpdating = True
Close #FNum
End Sub[/VBA]

____________________________________________
Nihil simul inventum est et perfectum

Abusus non tollit usum

Last night I dreamed of a small consolation enjoyed only by the blind: Nobody knows the trouble I’ve not seen!
James Thurber

Процедуры «Function» и «Sub» в VBA

Встроенные функции VBA

Перед тем, как приступить к созданию собственных функций VBA, полезно знать, что Excel VBA располагает обширной коллекцией готовых встроенных функций, которые можно использовать при написании кода.

Список этих функций можно посмотреть в редакторе VBA:

  • Откройте рабочую книгу Excel и запустите редактор VBA (нажмите для этого Alt+F11), и затем нажмите F2.
  • В выпадающем списке в верхней левой части экрана выберите библиотеку VBA.
  • Появится список встроенных классов и функций VBA. Кликните мышью по имени функции, чтобы внизу окна отобразилось её краткое описание. Нажатие F1 откроет страницу онлайн-справки по этой функции.

Кроме того, полный список встроенных функций VBA с примерами можно найти на сайте Visual Basic Developer Centre.

Пользовательские процедуры «Function» и «Sub» в VBA

В Excel Visual Basic набор команд, выполняющий определённую задачу, помещается в процедуру Function (Функция) или Sub (Подпрограмма). Главное отличие между процедурами Function и Sub состоит в том, что процедура Function возвращает результат, процедура Sub – нет.

Поэтому, если требуется выполнить действия и получить какой-то результат (например, просуммировать несколько чисел), то обычно используется процедура Function, а для того, чтобы просто выполнить какие-то действия (например, изменить форматирование группы ячеек), нужно выбрать процедуру Sub.

Аргументы

При помощи аргументов процедурам VBA могут быть переданы различные данные. Список аргументов указывается при объявлении процедуры. К примеру, процедура Sub в VBA добавляет заданное целое число (Integer) в каждую ячейку в выделенном диапазоне. Передать процедуре это число можно при помощи аргумента, вот так:

Имейте в виду, что наличие аргументов для процедур Function и Sub в VBA не является обязательным. Для некоторых процедур аргументы не нужны.

Необязательные аргументы

Процедуры VBA могут иметь необязательные аргументы. Это такие аргументы, которые пользователь может указать, если захочет, а если они пропущены, то процедура использует для них заданные по умолчанию значения.

Возвращаясь к предыдущему примеру, чтобы сделать целочисленный аргумент функции необязательным, его нужно объявить вот так:

В таком случае целочисленный аргумент i по умолчанию будет равен 0.

Необязательных аргументов в процедуре может быть несколько, все они перечисляются в конце списка аргументов.

Передача аргументов по значению и по ссылке

Аргументы в VBA могут быть переданы процедуре двумя способами:

  • ByVal – передача аргумента по значению. Это значит, что процедуре передаётся только значение (то есть, копия аргумента), и, следовательно, любые изменения, сделанные с аргументом внутри процедуры, будут потеряны при выходе из неё.
  • ByRef – передача аргумента по ссылке. То есть процедуре передаётся фактический адрес размещения аргумента в памяти. Любые изменения, сделанные с аргументом внутри процедуры, будут сохранены при выходе из процедуры.
Читать еще:  Скачать видео с любого ресурса

При помощи ключевых слов ByVal или ByRef в объявлении процедуры можно задать, каким именно способом аргумент передаётся процедуре. Ниже это показано на примерах:

Помните, что аргументы в VBA по умолчанию передаются по ссылке. Иначе говоря, если не использованы ключевые слова ByVal или ByRef, то аргумент будет передан по ссылке.

Перед тем как продолжить изучение процедур Function и Sub более подробно, будет полезным ещё раз взглянуть на особенности и отличия этих двух типов процедур. Далее приведены краткие обсуждения процедур VBA Function и Sub и показаны простые примеры.

VBA процедура «Function»

Редактор VBA распознаёт процедуру Function, когда встречает группу команд, заключённую между вот такими открывающим и закрывающим операторами:

Как упоминалось ранее, процедура Function в VBA (в отличие от Sub), возвращает значение. Для возвращаемых значений действуют следующие правила:

  • Тип данных возвращаемого значения должен быть объявлен в заголовке процедуры Function.
  • Переменная, которая содержит возвращаемое значение, должна быть названа так же, как и процедура Function. Эту переменную не нужно объявлять отдельно, так как она всегда существует как неотъемлемая часть процедуры Function.

Это отлично проиллюстрировано в следующем примере.

Пример VBA процедуры «Function»: Выполняем математическую операцию с 3 числами

Ниже приведён пример кода VBA процедуры Function, которая получает три аргумента типа Double (числа с плавающей точкой двойной точности). В результате процедура возвращает ещё одно число типа Double, равное сумме первых двух аргументов минус третий аргумент:

Эта очень простая VBA процедура Function иллюстрирует, как данные передаются процедуре через аргументы. Можно увидеть, что тип данных, возвращаемых процедурой, определён как Double (об этом говорят слова As Double после списка аргументов). Также данный пример показывает, как результат процедуры Function сохраняется в переменной с именем, совпадающим с именем процедуры.

Вызов VBA процедуры «Function»

Если рассмотренная выше простая процедура Function вставлена в модуль в редакторе Visual Basic, то она может быть вызвана из других процедур VBA или использована на рабочем листе в книге Excel.

Вызов VBA процедуры «Function» из другой процедуры

Процедуру Function можно вызвать из другой VBA процедуры при помощи простого присваивания этой процедуры переменной. В следующем примере показано обращение к процедуре SumMinus, которая была определена выше.

Вызов VBA процедуры «Function» из рабочего листа

VBA процедуру Function можно вызвать из рабочего листа Excel таким же образом, как любую другую встроенную функцию Excel. Следовательно, созданную в предыдущем примере процедуру FunctionSumMinus можно вызвать, введя в ячейку рабочего листа вот такое выражение:

VBA процедура «Sub»

Редактор VBA понимает, что перед ним процедура Sub, когда встречает группу команд, заключённую между вот такими открывающим и закрывающим операторами:

VBA процедура «Sub»: Пример 1. Выравнивание по центру и изменение размера шрифта в выделенном диапазоне ячеек

Рассмотрим пример простой VBA процедуры Sub, задача которой – изменить форматирование выделенного диапазона ячеек. В ячейках устанавливается выравнивание по центру (и по вертикали, и по горизонтали) и размер шрифта изменяется на заданный пользователем:

Данная процедура Sub выполняет действия, но не возвращает результат.

В этом примере также использован необязательный (Optional) аргумент iFontSize. Если аргумент iFontSize не передан процедуре Sub, то его значение по умолчанию принимается равным 10. Однако же, если аргумент iFontSize передается процедуре Sub, то в выделенном диапазоне ячеек будет установлен размер шрифта, заданный пользователем.

VBA процедура «Sub»: Пример 2. Выравнивание по центру и применение полужирного начертания к шрифту в выделенном диапазоне ячеек

Следующая процедура похожа на только что рассмотренную, но на этот раз, вместо изменения размера, применяется полужирное начертание шрифта в выделенном диапазоне ячеек. Это пример процедуры Sub, которой не передаются никакие аргументы:

Вызов процедуры «Sub» в Excel VBA

Вызов VBA процедуры «Sub» из другой процедуры

Чтобы вызвать VBA процедуру Sub из другой VBA процедуры, нужно записать ключевое слово Call, имя процедуры Sub и далее в скобках аргументы процедуры. Это показано в примере ниже:

Если процедура Format_Centered_And_Sized имеет более одного аргумента, то они должны быть разделены запятыми. Вот так:

Вызов VBA процедуры «Sub» из рабочего листа

Процедура Sub не может быть введена непосредственно в ячейку листа Excel, как это может быть сделано с процедурой Function, потому что процедура Sub не возвращает значение. Однако, процедуры Sub, не имеющие аргументов и объявленные как Public (как будет показано далее), будут доступны для пользователей рабочего листа. Таким образом, если рассмотренные выше простые процедуры Sub вставлены в модуль в редакторе Visual Basic, то процедура Format_Centered_And_Bold будет доступна для использования на рабочем листе книги Excel, а процедура Format_Centered_And_Sized – не будет доступна, так как она имеет аргументы.

Вот простой способ запустить (или выполнить) процедуру Sub, доступную из рабочего листа:

  • Нажмите Alt+F8 (нажмите клавишу Alt и, удерживая её нажатой, нажмите клавишу F8).
  • В появившемся списке макросов выберите тот, который хотите запустить.
  • Нажмите Выполнить (Run)

Чтобы выполнять процедуру Sub быстро и легко, можно назначить для неё комбинацию клавиш. Для этого:

  • Нажмите Alt+F8.
  • В появившемся списке макросов выберите тот, которому хотите назначить сочетание клавиш.
  • Нажмите Параметры (Options) и в появившемся диалоговом окне введите сочетание клавиш.
  • Нажмите ОК и закройте диалоговое окно Макрос (Macro).

Внимание: Назначая сочетание клавиш для макроса, убедитесь, что оно не используется, как стандартное в Excel (например, Ctrl+C). Если выбрать уже существующее сочетание клавиш, то оно будет переназначено макросу, и в результате пользователь может запустить выполнение макроса случайно.

Область действия процедуры VBA

В части 2 данного самоучителя обсуждалась тема области действия переменных и констант и роль ключевых слов Public и Private. Эти ключевые слова так же можно использовать применительно к VBA процедурам:

Собственная функция Excel: Ошибка компиляции: Sub или Function не определены

У нас есть система, которая всегда экспортирует данные IP-адреса с трехзначными октетами. Я пытаюсь создать собственную функцию в Excel, чтобы удалить любые ненужные начальные нули с этих IP-адресов. У меня есть проверенная формула, которая выполняет это, но при попытке создать функцию я получаю ошибку компиляции: Sub или Function не определены. Любая помощь будет оценена.

Читать еще:  Excel найти дубликаты и выделить цветом

формула, которая работает:

например, если ячейка A2 содержит 010.110.009.254, эта формула приводит к 10.110.9.254

Я ожидаю, что = IPFix (A2) приведет к правильному формату IP без начальных нулей. Однако я просто получаю эту ошибку компиляции.

Заменить Substitute с Replace на VBA функции

VBA размещается в Excel, но он совершенно особенный: VBA ничего не знает о функциях листа Excel. По крайней мере, не изначально.

Итак, Substitute нигде не определен — то же самое для VLookup и многих других функций листа. Некоторые функции VBA имеют то же имя (или похожее), что и функции листа Excel, и ведут себя по-разному.

Стандартная библиотека VBA имеет модуль Strings который предоставляет ряд специализированных функций String (некоторые из которых также существуют в виде функций рабочего листа, например, =LEFT vs Left и Left$ ).

Как правильно указывает Том, стандартной библиотечной функцией VBA, которая эквивалентна функции Substitute Excel, является Replace — функция, определенная в модуле VBA.Strings , которую вы можете исследовать, нажав F2 , чтобы вызвать VBE Object Browser:

Поскольку все эти функции имеют глобальную область действия, вам не нужно полностью их квалифицировать; вот почему и как вы можете легально написать Debug.Print Replace(string1, string2) . Но знайте, что вы всегда можете набрать VBA. и получить IntelliSense, чтобы перечислить, какие функции доступны — VBA.Strings.Replace работает, как и VBA.Replace , или просто Replace :

Теперь это многословно. Преимущество в том, что теперь, если ваш проект VBA определяет функцию Replace , места, которые вызывают VBA.Strings.Replace или VBA.Replace , будут по-прежнему вызывать эту функцию вместо вашей пользовательской функции VBAProject.Module1.Replace — потому что ссылка на идентификатор в VBA всегда разрешается компилятором, начиная с наименьшей доступной области: пользовательская функция может существовать в пользовательском модуле и «скрывать» или «скрывать» функцию стандартной библиотеки VBA (или любую другую функцию, определенную в любом другом ссылочном типе). библиотека).

И наконец, обратите внимание, что для случаев, когда вам действительно необходимо вызвать фактическую функцию рабочего листа, вы можете сделать это из объектной модели Excel — здесь с With блока With чтобы уменьшить словесность:

Функции рабочего листа, вызываемые следующим образом, будут работать точно так же, как их действительные аналоги; таким образом вы можете использовать Index , Match , VLookup и многие другие функции рабочего листа с помощью стандартного вызова члена VBA с ранней привязкой, который вызовет стандартную ошибку времени выполнения VBA при наличии недопустимых аргументов.

Вы также можете вызывать их с поздним связыванием непосредственно с объектом Application — в этом случае недопустимые аргументы не вызовут ошибку, а вернут ее — точно так же, как в реальных #VALUE! (например, #VALUE! ) — если вы хотите вернуть Это значение ошибки рабочего листа, ваша функция должна возвращать Variant (неявный, как у вас, или явный, как указано ниже), потому что Error — это тип данных VBA, который не может быть приведен к значению String , поэтому возвращаемое присваивание выдает ошибка несоответствия типов:

Обратите внимание, что поскольку эти вызовы имеют позднюю привязку, они разрешаются только во время выполнения, что означает, что вы должны быть очень осторожны с опечатками; вы также не получаете никакой IntelliSense или «быстрой информации о параметрах», чтобы помочь при вводе.

Excel sub or function not defined

Перевести · “Sub or Function not defined” when trying to run a VBA script in Outlook. Ask Question . I solved it by deleting the macro created (in the docx: . Sub or Function not defined in VBA Excel 2016. 0. Calling Outlook Script by using an Excel Macro.

Excel VBA Macro Sub or Function not defined — Super …

Перевести · I used the macro recorder to generate a macro in Excel 2007. . Excel VBA Macro Sub or Function not defined. Ask Question Asked 8 years, 10 months ago. . (the name of my sub

Sub or Function not defined — Visual Basic | Microsoft Docs

Перевести · Specifying a procedure that is not visible to the calling procedure. Declaring a Windows dynamic-link library (DLL) routine or Macintosh code-resource routine that is not

Видео

Why do I receive a «Compile error: Sub or Function not .

Перевести · Why do I receive a «Compile error: Sub or. Learn more about excel, excellink, excllink, sub, function, not, defined, vba, macro, compiler, error .

Compile error: Sub or Function not defined («SolverOk»)

Перевести · 24.12.2011 · Compile error: Sub or Function not defined («SolverOk») I recorded a macro and then tried to run it. The macro includes repeated use of the Solver Tool, to save me some time. Excel does not recognize the «SolverOk» nomenclature . Sub or Function not defined («SolverOk

VBA Errors Compile Error Sub or Function not defined — You…

Перевести · 06.08.2018 · Getting Started with Open Broadcaster Software OBS — …

  • Автор: YourProgrammingNetwork
  • Просмотры: 12 тыс.

#15 How To Fix VBA Compile Error| Sub or Function Not .

Перевести · 24.10.2019 · In this video you will learn about how to fix compile error. If you see error related to sub or function not defined

  • Автор: BP Computer Academy
  • Просмотры: 1,2 тыс.

sub or function not defined in vba | MrExcel Message Board

Перевести · 26.02.2018 · Hi All, i am getting a error sub or function not defined in vba, can any one help. Sub xyz() counter = 1 …

Sub or Function not defined | MrExcel Message Board

Перевести · 25.05.2014 · You are missing a Function, not a Sub. But even if you supply the function, you will have another problem with that line of code. you do not have any lines of code assigning a value to STOCK# which is to be passed into the function

Читать еще:  Vba excel выход из цикла

Sub, Function, or Property not defined (Error 35 .

Перевести · Sub, Function, or Property not defined (Error 35) 06/08/2017; 2 minutes to read +1; In this article. A Sub, Function, or Property procedure must be defined

WindowsExcel – электронные таблицы

Реклама Скачивай бесплатный редактор электронных таблиц XLS для работы и учебы

Создаем свою первую функцию в Excel

Что такое функция в VBA?

Функция написанная на VBA — это код, который выполняет вычисления и возвращает значение (или массив значений). Создав функцию вы можете использовать ее тремя способами:

  1. В качестве формулы на листе, где она может принимать аргументы и возвращать значения.
  2. Как часть вашей подпрограммы VBA. В процедуре Sub или внутри других функций.
  3. В правилах условного форматирования.

Хотя Excel уже содержит более 450 встроенных функций, но их тоже периодически не хватает. Иногда встроенные функции не могут выполнить то, что вы хотите сделать. Иногда для достижения результата необходимо создать огромную и сложную формулу, которая не понятна окружающим. В этом случае вы можете создать пользовательскую функцию, которую легко читать и использовать.

Обратите внимание, что пользовательские функции, созданные с помощью VBA, как правило значительно медленнее, чем встроенные функции. Следовательно, они лучше всего подходят для ситуаций, когда вы не можете получить результат, используя встроенные функции или вычислений не много и снижение производительности не критично.

В чем отличие процедуры (Sub) от функции (Function)?

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

Для демонстрации приведем пример. Например есть ряд чисел от 1 до 100 и необходимо отделить четные от нечетных.

С помощью процедуры (sub) вы можете, к примеру, пройтись по ячейкам и выделить нечетные с помощью заливки. А функцию можно использовать в соседнем столбце и она вернет ИСТИНА или ЛОЖЬ в зависимости от того четное значение или нет. Т.е. вы не сможете изменить цвет заливки с помощью функции на листе.

Создание простой пользовательской функции в VBA

Давайте создадим простую пользовательскую функцию на VBA и посмотрим как там все работает.

Ниже представлен код функции, которая из текста оставляет только цифры, отбрасывая буквенные значения.

Чтобы у вас все заработало, необходимо вставить данный код в модуль книги. Если вы не знаете как это сделать, то начните со статьи Как записать макрос в Excel.

Теперь посмотрим как функция работает, попробуем использовать ее на листе:

Прежде чем разбирать саму функцию отметим 2 приятных момента, которые появились после создания:

  • Она стала доступна, как и любая другая встроенная функция (как создать скрытую функцию, расскажем далее).
  • Когда вы ввели знак «=» и начинаете вводить имя функции, то Excel выводит все совпадения и показывает не только встроенные функции, но и пользовательские.

Разбираем функцию пошагово

Теперь давайте глубоко погрузимся и посмотрим, как эта функция создавалась. Начинается функция со строки

Слово Function говорит о начале функции, далее идет ее название, в нашем случае Цифры.

  • Имя функции не может содержать пробелов. Кроме того, вы не можете назвать функцию, если она сталкивается с именем ссылки на ячейку. Например, вы не можете назвать функцию ABC123, так как это имя также относится к ячейке в листе Excel.
  • Вы не должны указывать на свою функцию то же имя, что и у существующей функции. Если вы это сделаете, Excel будет отдавать предпочтение встроенной функции.
  • Вы можете использовать символ подчеркивания, если хотите разделить слова. Например, Сумма_Прописью является допустимым именем.

После названия в круглых скобках описываются аргументы функции. По аналогии со встроенными функциями Excel. В нашем случае используется единственный аргумент Текст. После названия аргумента мы указали As String, это означает, что наш аргумент — текстовое значение или ссылка на ячейку, содержащее текстовое значение. Если вы не укажете тип данных, VBA рассмотрит его как Variant (что означает, что вы можете использовать любой тип данных, VBA его определит самостоятельно).

Последняя часть первой строки As Long задает тип данных, которая возвращает функция. В нашем случае функция будет возвращать целые значения. Это также не обязательно.

Вторая и третья строка функции объявляет дополнительные внутренние переменные, которые мы будем использовать.

Переменную i мы буем использовать для перебора символов. А переменную result для хранения промежуточного результата функции.

Задача функции — пройти по всем символам переменной Текст и сохранить только те, что являются цифрами. Поэтому начнем цикл с 1 и до последнего символа.

Len — функция, которая определяет количество символов.

Основная строка функции — это проверка является ли очередной символ текста цифрой и если да — то сохранение его в переменной result

Для этого нам потребуется функция IsNumeric — она возвращает True если текст — число и False в противном случае.

Функция Mid берет из аргумента Текст i-ый символ (значение 1, указывает что функция Mid берет только 1 символ)/

Функция Next — закрывает цикл For тут все понятно.

Этой строкой мы преобразовываем текстовую переменную result, которая содержит все цифры аргумента Текст, в числовое значение. И говорим какой результат должна вывести наша функция Цифры.

Последняя строка кода — End Function. Это обязательная строка кода, которая сообщает VBA, что код функции заканчивается здесь.

В приведенном выше коде описаны различные части типичной пользовательской функции, созданной в VBA. В следующих статьях мы более подробно разберем эти элементы, а также рассмотрим различные способы выполнения функции VBA в Excel.

Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector
×
×