Как работает: есть таблица с 2 столбцами, в первой искомый текст, во втором текст на замену. Выделяю первый столбец и запускаю скрипт. Все проверил 100 раз - должно работать, но не работает. Имя файла верное, строки для поиска и замены верные, но ошибка при попытке выполнить саму замену в строке. Наверняка, глупая ошибка, но в упор не вижу. Заранее спасибо. P.S. при выделении 1 ячейки в первом столбце все работает, проблема появляется лишь при выделении диапазона ячеек (2 и более). Значит, после первого прохода ссылка на диапазон теряется? Я даже не знаю, в чем может быть ошибка.
Цитата
k.UsedRange.Replace i.Value, i.Offset(, 1).Value
Код
'Список файлов на пакетную обработку
Function ScanFolder()
Dim sFolder As String, sFiles As String
Dim str As String
Dim s() As String
'диалог запроса выбора папки с файлами
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = False Then Exit Function
sFolder = .SelectedItems(1)
End With
sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator)
sFiles = Dir(sFolder & "*.xls*")
str = ""
Do While sFiles <> ""
'сохраняем полный путь в массив строк
If str = "" Then str = sFolder & sFiles Else str = str & "^" & sFolder & sFiles
sFiles = Dir()
Loop
s = Split(str, "^")
ScanFolder = s
End Function
Sub Замена()
Dim fls() As String 'файлы на обработку
Dim sFld As String 'запрашиваем адрес папки на сохранение
Application.ScreenUpdating = False
fls = ScanFolder()
Dim r As Range
Set r = Selection
For Each f In fls() 'перебираем файлы в папке
MsgBox f
Set wa = Application.Workbooks.Open(f)
For Each k In wa.Worksheets
For Each i In r 'делаем замену в документе
'открываем документ в новом окне
'ищем текст на земену и заменяем
MsgBox i.Value
MsgBox i.Offset(, 1).Value
'wa.Worksheets(1).UsedRange.Replace i.Value, i.Offset(, 1).Value
k.UsedRange.Replace i.Value, i.Offset(, 1).Value
wa.Save
wa.Close
Next i
Next k
Next f
End Sub
Здравствуйте. Для удобства работы и скорости запросов понадобилось хранить данные в базе данных с возможностью редактирования. По сути, сейчас решаю, дальше изучать VBA, или перейти на C#. Установка драйвера баз данных ранее уже приводила к багам и замедлению работы некоторых приложений на старых ПК. Начал искать портативные решения - на форумах пишут, что mysql и sqlite требуют обязательной установки драйвера на ПК. Существуют ли какие-то не очень сложные портативные варианты создания и управления базой данных через VBA?
Здравствуйте. Сделал небольшой пример для воспроизведения возникшей у меня ошибки при замене текста на листе.
Код
Sub test()
'MsgBox Range("A1").Value
Dim txt As String
ActiveSheet.UsedRange.Replace "Рразд1", Range("A1").Value
End Sub
Текстовое поле вставил для проверки, что ошибку провоцирует не оно, данный код по идее не должен с ним взаимодействовать. Замена текста долгое время работала, а потом при изменении формулировок начало выдавать ошибку Неверный тип. Если изменить текст в ячейке А1 на "123", все заработает. Файл
Здравствуйте. Вставил в документ Word текстовое поле (Вставка - Текстовое поле), ввел в него текст. Проверил - встроенная функция Word заменяет в нем текст так же, как и любой другой, при записи макроса выдает стандартный код vba для замены текста. При запуске этого скрипта из Excel замена обычного текста работает, текста в поле - нет. Пожалуйста, дайте пример, как обратиться к тексту внутри текстового поля. Sub Макрос1()
Код
'
' Макрос1 Макрос
'
'
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "99887766"
.Replacement.Text = "работает"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub
Здравствуйте. Есть текстовый документ формата А4, оформленный в формате excel. Самая проблемная часть здесь - многострочные поля с подчеркиванием до конца листа. Нельзя просто взять и вставить длинную строку в ячейку, приходится тратить время и вручную разбивать на две или более. Можно конечно использовать автоперенос текста в пределах ячейки, но подчеркивание тогда будет лишь у последней строки теста. А нужно, чтобы у каждой и обязательно до конца листа. Правильно ли я понимаю, что данная проблема не имеет решения в excel?
Здравствуйте. Если открыть файл CSV двойным щелчком, откроется в виде неоформленной таблицы excel в один столбец с разделителями. Если открыть через скрипт vba, откроется таблица в несколько столбцов с данными.
Код
Dim fl
fl = Application.GetOpenFilename("Файл локализации мода(*.csv*),*.csv*", 1, "Выбрать файл локализации мода", , False)
If VarType(fl) = vbBoolean Then
'была нажата кнопка отмены - выход из процедуры
Exit Sub
End If
Application.ScreenUpdating = False
Set fnd = ActiveSheet.Range("A2:A5722")
'открываем книгу в новом окне
Set ww = Application.Workbooks.Open(fl)
Вопрос: как с помощью скрипта открыть CSV файл в том же виде, как он открывается двойным щелчком? Нет, мне не надо импортировать данные, мне нужно, чтобы скрипт открыл CSV файл именно в таком виде.
Здравствуйте. Обращаюсь к единственному открытому документу autocad из excel. Ищу строки по шаблону (как умею) и заношу в excel. Первое значение записывает нормально, на втором выдает ошибку - object required. Никак не могу понять, в чем дело. Тип объекта, значение выводил посредством msgbox, все было правильно. Но при попытке записать в ячейку выдает ошибку.
Код
'ищем текст по шаблону и пишем в excel
Sub TextList()
Dim aApp As AcadApplication 'доступ к приложению
Dim aDoc As acaddocument 'доступ к документу
Set aApp = GetObject(, "Autocad.Application")
Set aDoc = aApp.ActiveDocument 'обращаемся к активному чертежу
Set r = ActiveSheet.Cells.Range("A1")
For Each entity In aDoc.ModelSpace
If entity.ObjectName = "AcDbMText" Then 'если мультитекст
If Left(Right(entity.TextString, Len(entity.TextString) - InStr(entity.TextString, "/")), 4) = "М4.2" And Left(entity.TextString, 2) = "Cт" Then
r.Value = CStr(entity.TextString)
r = r.Offset(1)
End If
End If
Next
End Sub
Здравствуйте. Создал скрипт для пакетной замены одной фамилии на другую. Когда вбиваю в команду Replace текст на поиск и замену напрямую, все работает, когда считываю из ячеек и подставляю через переменные - не работает.
Код
'Список файлов на пакетную обработку
Function ScanFolder()
Dim sFolder As String, sFiles As String
Dim str As String
Dim s() As String
'диалог запроса выбора папки с файлами
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = False Then Exit Function
sFolder = .SelectedItems(1)
End With
sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator)
sFiles = Dir(sFolder & "*.xls*")
str = ""
Do While sFiles <> ""
'сохраняем полный путь в массив строк
If str = "" Then str = sFolder & sFiles Else str = str & "^" & sFolder & sFiles
sFiles = Dir()
Loop
s = Split(str, "^")
ScanFolder = s
End Function
Sub Замена()
Dim fls() As String 'файлы на обработку
Dim sFld As String 'запрашиваем адрес папки на сохранение
Application.ScreenUpdating = False
fls = ScanFolder()
'sFld = GetFolder("E:\Скрипты")
For Each f In fls()
'открываем книгу в новом окне
Set ww = Application.Workbooks.Open(f)
'ищем текст на земену и заменяем
Set fnd = ww.ActiveSheet.Range("B1")
Set zam = ww.ActiveSheet.Range("B2")
ww.ActiveSheet.UsedRange.Replace fnd.Value, zam.Value
Application.DisplayAlerts = False
ww.Save
ww.Close
Application.DisplayAlerts = True
Next f
Application.ScreenUpdating = True
End Sub
Vba самопроизвольно меняет путь сохранения файлов и названия некоторых файлов, Vba самопроизвольно меняет путь сохранения файлов и названия некоторых файлов
Здравствуйте. Есть несложный скрипт. Получаю список всех файлов excel в указанной папке, по очереди открываю, делаю замену некоторых слов и закрываю. Сохранение происходит через .save. 1. Vba сохраняет изменённые файлы не с перезаписью оригиналов, а на уровень выше. Это странно, ведь используется команда .save, которая не подразумевает создание нового файла. 2. Имена файлов 1.xlsx и 2.xlsx превратились в 11 и 21.xlsx. Повторю, использовал команду .save. Вопрос: почему подробное может происходить? Windows 10. Если важно, запросы отключаю перед сохранением.
Код
'Список файлов на пакетную обработку
Function ScanFolder()
Dim sFolder As String, sFiles As String
Dim str As String
Dim s() As String
'диалог запроса выбора папки с файлами
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = False Then Exit Function
sFolder = .SelectedItems(1)
End With
sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator)
sFiles = Dir(sFolder & "*.xls*")
str = ""
Do While sFiles <> ""
'сохраняем полный путь в массив строк
If str = "" Then str = sFolder & sFiles Else str = str & "^" & sFolder & sFiles
sFiles = Dir()
Loop
s = Split(str, "^")
ScanFolder = s
End Function
Sub test()
Dim fls() As String 'файлы на обработку
Dim sFld As String 'запрашиваем адрес папки на сохранение
Application.ScreenUpdating = False
fls = ScanFolder()
'sFld = GetFolder("E:\Скрипты")
For Each f In fls()
'открываем книгу в новом окне
Set ww = Application.Workbooks.Add(f)
'ищем текст на земену и заменяем
ww.ActiveSheet.UsedRange.Replace "Мезеровский А.В.", "Шишкин С.Н."
Application.DisplayAlerts = False
ww.Save
ww.Close
Application.DisplayAlerts = True
Next f
Application.ScreenUpdating = True
End Sub
Здравствуйте. Требуется выделить текст между 2-я словами в документе word из excel и затем заменить. Столкнулся с тем, что придется использовать тип данных range из word. Как определить переменную этого типа в excel?
ub MakeForm()
Dim TempForm As Object 'VBComponent
Dim NewButton As Msforms.CommandButton
Dim Line As Integer
Dim TheForm
Application.VBE.MainWindow.Visible = False
' Создание диалогового окна UserForm
Set TempForm = ThisWorkbook.VBProject. _
VBComponents.Add(3) 'vbext_ct_MSForm
With TempForm
.Properties("Caption") = "Временная форма"
.Properties("Width") = 200
.Properties("Height") = 100
End With
' Добавление элемента управления CommandButton
Set NewButton = TempForm.Designer.Controls _
.Add("forms.CommandButton.1")
With NewButton
.Caption = "Щелкни!"
.Left = 60
.Top = 40
End With
With TempForm.CodeModule
Line = .CountOfLines
.InsertLines Line + 1, "Sub CommandButtonl_Click()"
.InsertLines Line + 2, "MsgBox ""Привет!"""
.InsertLines Line + 3, "Unload Me"
.InsertLines Line + 4, "End Sub"
End With
' Отображение диалогового окна UserForm
VBA.UserForms.Add(TempForm.Name).Show
' Удаление диалогового окна UserForm
ThisWorkbook.VBProject.VBComponents.Remove TempForm
End Sub
Что если при нажатии на кнопку формы требуется удалить эту форму?
Код
With TempForm.CodeModule
Line = .CountOfLines
.InsertLines Line + 1, "Sub CommandButtonl_Click()"
.InsertLines Line + 2, "ThisWorkbook.VBProject.VBComponents.Remove TempForm"
.InsertLines Line + 3, "End Sub"
End With
Но это не будет работать, поскольку не понятно, как в создаваемое событие Sub CommandButtonl_Click() передать параметр TempForm. Пробовал другое решение: "ThisWorkbook.VBProject.VBComponents.Remove Me", ошибка - type mismatch. Хотя вроде бы Me - ссылка на родителя, а для кнопки это форма. Пробовал помещать строку "ThisWorkbook.VBProject.VBComponents.Remove Me" в создаваемые для формы события Unload и Terminate - ошибок нет, но форма не удаляется.
Sub test()
Dim str As String
str = ActiveSheet.ListObjects("Разделительная").Range.Address
Range(str).Cells(Range(str).Rows.Count, 1).End(xlUp).Row.Select
End Sub
Sub УдалПеренос()
Dim r As Range
Dim str As String
For Each r In Selection
str = r.Value
If (InStr(str, Chr(10)) <> 0) Then
str = Left(str, InStr(str, Chr(10)) - 1)
r.Value = str
End If
Next r
End Sub
работа с ячейкой Е1. скрипт призван находить знак перевода строки и удалять все, что идет после него. Проблема в том, что скрипт почему-то еще и меняет формат ячейки и вместо дробного числа получаем огромное целое. Логика ускользает: в ячейку с общим форматом сохраняем значение текстовой переменной, и формат сам меняется на числовой. Специфика документа в том, что надо оставить число как есть - то есть оставить общий тип данных ячейки. Поэтому через Format не выйдет - ведь заранее число знаков после запятой неизвестно, да и при последующей работе с документом будут сложности.
Здравствуйте. В книге есть несколько изображений на разных листах. Каждому из них можно присвоить имя (как для диапазона ячеек), и в соответствии с ним произвести над каждым изображением разные действия. Только вопрос - как проверить это самое имя при переборе изображений? Я готов даже смириться с невозможность получить доступ к изображению на уровне книги (майкрософт, этим все сказано), но в свойстве name элемента Shapes можно посмотреть только условные имена - Рисунок1, Рисунок2..., что не позволяет отличить одно изображение от другого.
именованные диапазоны хранятся в массиве names. В диспетчере имен там перечислены в том числе и таблицы. Имеем например таблицу с именем "Бетон". проверяю доступ к таблице:
- пытаюсь обратиться к первой ячейке первого столбца таблицы Ошибка. Выходит, таблицы перечислены в другом массиве? Но каком? Обращение к именованному диапазону происходит без ошибок, за исключением таблиц.
Здравствуйте. Скрипт запускается из книги excel (we), создает новую книгу по шаблону (ww). Потом надо обратиться к диапазону первой книги, но выдает ошибку в строке MsgBox (we.Parent.Intersect(Range("ДопДокументы"), Range("ДопДокументы_Документ")).Cells(1).Value). Обращение к диапазону производится через его имя, когда книга активна - все работает, но когда свернута в фоне, приходится прописывать полный путь с указанием листа, на котором расположен диапазон.
Код
Sub DopDocuments() 'автосоздание доп.документов по шаблону
Dim r As Range 'для чтения списка доп документов
Dim n As name 'для чтения аргументов доп документа
Set we = ThisWorkbook 'запомнили книгу с данными и скриптом
Application.DisplayAlerts = False 'вроде как отключает уведомления
For Each r In Intersect(Range("ДопДокументы"), Range("ДопДокументы_Документ")) 'перебираем доп.документы
Set ww = Application.Workbooks.Add("D:\Системные файлы\Документы\Настраиваемые шаблоны Office\" & r.Value & ".xltx") 'создали новую книгу
For Each n In ww.Names 'перебираем имена внутри доп.документа
MsgBox (Intersect(we.Parent.Range("ДопДокументы"), we.Parent.Range("ДопДокументы_Документ")).Cells(1).Value)
Next n
Next r
End Sub
здравствуйте. конкретно меня интересует печать в word из excel, но команды печати для обеих программ в общем-то однотипные. Для Application.PrintOut Method нашел только ManualDuplexPrint (двусторонняя печать с поворотом листов вручную). Но ведь при печати через интерфейс excel или word настройки двусторонней печати есть, можно выбрать автоповорот листов на принтерах с такой функцией, тогда вопрос - где искать подобную настройку в vba? Находил решения, но для более старых версий офиса, которые еще не имели нативной поддержки двусторонней печати - там необходимо было менять настройки принтера.
Sub Act()
Dim r As Range
Dim t As String
Dim j As Integer 'счетчик числа актов для нумерации
Dim fold As String 'хранит адрес каталога, куда сохранятся акты
j = 0
Set wa = CreateObject("Word.Application")
wa.Visible = True
wa.DefaultSaveFormat = "" 'по-умолчанию сохраняет в старый формат word. Затестить в docx.
'wd = NewDoc("Акт")
fold = GetFolder("D:\Работа\")
For Each r In Intersect(Range("динам"), Range("Акт")) 'в столбце Акты число строк равно числу актов
Set wd = wa.Documents.Add("D:\Системные файлы\Документы\Пользовательские шаблоны Office\Акт2.dotx", True) 'создаем новый документ для каждого акта
For Each i In wd.bookmarks 'перебор всех закладок для каждого акта
If Left(i.name, 3) = "dnm" Then
t = Intersect(Range("динам"), Range(Replace(i.name, "dnm", ""))).Cells(r.Row - 1).Value 'если динамическая - данные из таблицы
If (i.name = "dnmЧисло") Or (i.name = "dnmЧисло1") Or (i.name = "dnmЧисло2") Then t = Format(t, "« dd » mmmm yyyy г.") 'обработка дат по формату. может, добавить префикс для автообработки дат?
i.Range.Text = t
End If
If Left(i.name, 3) = "scr" Then
t = ProcessDol(i.name, Range("Число").Cells(r.Row - 1).Value)
i.Range.Text = t
End If
If (Left(i.name, 3) <> "dnm") And (Left(i.name, 3) <> "scr") Then
i.Range.Text = Range(i.name).Value 'иначе - юзаем статику
End If
Next i
j = j + 1
wd.SaveAs (fold & "Акт" & j & ".doc") 'сохраняем документ с именем типа Акт1.docx. Позднее научить сохранять с названием работ.
wd.Close 'просто закрыли документ. после удачного испытания убрать эту строку.
Next r
End Sub
код запускается из excel. он создает документ word на основе шаблона, считывает из него закладки и затем заполняет их из таблицы excel. ранее все работало, но я добавил пару новых условий для i.name, которая на момент ошибки равна dnmАкт. На входе в условие If Left(i.name, 3) = "dnm" все нормально, а на следующем условии If Left(i.name, 3) = "scr" объект i удален, и я не понимаю как, ведь в него просто записалось новое значение. Неужели при этом старый объект удаляется, создается новый и использовать его в данной итерации цикла больше нельзя?
Function NewForm(name As String) As Object
Dim myForm As Object
'Application.VBE.MainWindow.Visible = False
Set myForm = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm)
myForm.Properties("Caption") = name
myForm.Properties("Width") = 300
myForm.Properties("height") = 270
VBA.UserForms.Add(myForm.name).Show
Set CreateForm = myForm
End Function
Sub DelForm(name As Object)
ThisWorkbook.VBProject.VBComponents.Remove name
End Sub
Sub Start()
Dim my As UserForm
Set my = NewForm("MyFormCaption")
'Call DelForm(my)
ThisWorkbook.VBProject.VBComponents.Remove my
End Sub
ошибок нет, но форма не удаляется. Заранее спасибо.
На разных версиях excel (2010-2016) периодически встречалась проблема: после ввода текста в ячейку высота строки иногда становится больше высоты текста на 1, иногда на 2 строки. Выглядит это как пустое пространство перед или после текста. Высоту каждой такой строки приходится выравнивать вручную, поскольку высота всех строк разная. Кто знает решение? Заранее спасибо.
Создал таблицу, назначил имя, в процессе заполнения в одном из столбцов потребовалось ввести формулу. Поскольку это было первое значение, введенное в этот столбец, то формула автоматически вставилась во все ячейки столбца. Заполняю таблицу дальше, и в каждую новую строчку продолжает вставляться эта формула, excel плевать, что я ее каждый раз удаляю. Я знаю, что автовставку формул можно отключить в настройках, но как сделать это для одного столбца? Заранее спасибо.
Программа запускается через макрос Zurn. Он считывает наименование работы, находит шаблон этой работы, подставляет данные и записывает в таблицу листа Черновик. Почти все время при запуске вываливается ошибка run-time error 1004: Method 'Intersect' of object '_Global' failed в строке, где переменной vrem присваивается значение ячейки столбца Даты. Первоначально разницу между датами я считал в программе, считывая столбцы Дата1 и Дата2 в переменные d1 и d2, но на переменной d2 начала вываливаться ошибка, хотя d1 присваивалась нормально (ну вот как так?) Для меня эта ошибка совершенно непонятна и нелогична, то появляется, то нет.
я нашел только Range("Таблица1").Rows, а дальше возможно есть команда для добавления новой строки в конце? Думал Range("Таблица1").Rows.Insert, но на непустой таблице он срабатывает странных образом - может добавить 2 пустых строки перед первой записью, или полностью деформировать таблицу.
Здравствуйте. В excel есть команда Отформатировать как таблицу, такие таблицы удобно использовать как небольшие базы данных. Дайте пожалуйста направление поиска, не могу найти команды vba для работы с такими таблицами. Что нужно: доступ к таблице по имени, добавление строк, удаление строк, определение числа строк и столбцов. Логика подсказывает, что работа с такими таблицами осуществляется специальными командами, но не могу найти в справочнике нужный объект. Сам excel определяет отформатированный как таблицу диапазон ячеек в качестве одного объекта и имеет о нем как минимум следующие данные: размер таблицы, размер заголовка, имя таблицы, и хотя бы адрес одного из углов таблицы. И эти данные наверняка доступны через vba.
при наборе кода подсказки крайне ограничены, нет автозавершения имен стандартных функций, для некоторых переменных не выводится список доступных методов и свойств после точки, хотя код работает правильно. Скачал файл справки с сайта майкрософт, но вот куда его кидать, не знаю. Надеюсь, он решит хотя бы часть проблем с подсказками.
Задача такая: функция принимает значение некой ячейки (например число 13924,17), прибавляет к нему случайное число и генерирует строку типа "13924,17/13927,19". Проблема в том, что случайное значение будет раз за разом генерироваться случайно. Есть ли способ заставить функцию генерировать новое случайное значение только 1 раз? Пытался добавить проверку равенства принимаемого значения ячейки и первой части сгенерированного текста (Application.Caller), но функция ругается, что значение зациклено (?! цикла нет, есть только проверка, которая запускается каждый раз при пересчете ячейки) и выдает 0.
Код
Function tmp(act As Variant) As Variant
Dim tmp1, tmp2
Dim a, b, i As Integer
a = -2
b = 2
Randomize
Dim cl As Range
Set cl = Application.Caller
If Left(cl.Value, InStr(cl.Value, "/")) <> act Then
label:
i = Int((b - a + 1) * Rnd + a)
If i = 0 Then GoTo label
tmp1 = Replace(Application.WorksheetFunction.Text(act, "0.00"), ".", ",")
tmp2 = Replace(Application.WorksheetFunction.Text(act + i / 100, "0.00"), ".", ",")
tmp = tmp1 & "/" & tmp2
End If
End Function
Приведенная выше функция принимает числовое значение, затем сравнивает его с первой частью значения ячейки, и если они не равны, работает дальше: прибавляет к исходному число небольшое случайно сгенерированное значение, затем форматирует исходное и полученное числа и склеивает. Но идиотские ограничения excel не позволяют функции работать, ведь зацикливания нет, происходит штатная работа функции с уже существующим значением ячейки. Как решить данную проблему?
ячейка передается как обычно - например, =ТЕКСТ(A3;"0.000"). Но проблема в том, что при этом передается значение ячейки, а мне надо работать не только с этой, но и соседними ячейками. например function PF (act as variant) as variant PF=cells(act.row,act.column+1).value ...... выдаст ошибку. Наверняка дико туплю, но не могу придумать, как избежать использования функций поиска по таблице. если это важно - придется ссылаться и на ячейки других листов, то есть, возможно, требуется дополнительная обработка.
прошу, кто знает, подскажите функции, через которые можно решить проблему.
Function fnd(st As Variant) As Variant
Dim str, stlb As Integer
str = Worksheets(1).Range("A1:A40").Find(ActiveSheet.Cells(ActiveCell.Row, 1).Value).Row
stlb = Worksheets(1).Range("A1:P1").Find(st).Column
fnd = Worksheets(1).Cells(str, stlb).Value
End Function
При копировании функции в другую строку ActiveCell не обновляет свое значение, что стало неприятным сюрпризом. Если перейти в режим редактирования ячейки и выйти - только тогда значение обновится. Как работает функция: она считывает значение ячейки в первом столбце, затем ищет это значение на 1-м листе книги. Если копирую формулу на другую строку - значение не меняется, для этого требуется перейти в режим редактирования ячейки. Автообновление формул включено. Кажется, единственное решение - передать ячейку 1-го столбца в качестве параметра. Ох уж эти майкрософт, не могли сделать инструмент, чтобы экземпляр формулы понял, в какой ячейке находится.
VBA использование в коде стандартных функций excel, Excel уже содержит кучу встроенных функций, которые мы используем в формулах. Они принимают значения ячеек и возвращают свои. Как их использовать в коде vba без вставки в ячейки?
Excel уже содержит кучу встроенных функций, которые мы используем в формулах. Они принимают значения ячеек и возвращают свои. Как их использовать в коде vba без вставки в ячейки? Я понимаю, что есть методы и свойства activex, но для новичка проще было бы вызвать уже знакомую функцию, передать ей средствами vba требуемые значения и средствами же vba принять возвращаемое значение, и все это без использования каких-либо ячеек таблицы. Достали 3-хэтажные формулы в ячейках, буду заменять их пользовательскими function, а на изучение свойств и методов activex просто нет времени. Ранее изучал vba для autocad, и в нем была функция, которая позволяла использовать стандартные текстовые команды программы (коими можно все - и линии чертить, и выводить на печать). Вот по аналогии нужно так же использовать команды формул.