Опишите, пожалуйста, подробнее - какая версия надстройки, что в ней требуется сделать, куда что вписать, что нажать, чтобы у всех был рабочий воспроизводимый пример её работы.
UPD. Судя по всему эта программа просто сохраняет ваши кислоты в FASTA-формате в файл "C:\ProgramData\SelectionAnalysis\protein" и затем вы можете воспроизвести всю операцию по сути с помощью
. Наверное, самым простым способом для упрощения было бы не создавать функцию (тогда всю логику из ячеек нужно переписать в неё), а чтобы из выбранных вами ячеек данные сохранялись в файл, вызывался LoadProteins, а потом с листа Aligned последовательности бы копировались на место / рядом с изначальными последовательностями.
Sub tranpose_test()
Dim arr As Variant
r = 2
c = 3
ReDim arr(1 To r, 1 To c) ' 2 x 3
arr = Application.Transpose(arr) ' 3 x 2
ReDim Preserve arr(1 To c, 1 To r + 2) ' 3 x 5
arr = Application.Transpose(arr) ' 5 x 3
End Sub
Sub array_of_arrays()
Dim outer
outer = Array(Array(1, 2), Array(3, 4)) ' 2 x 2
ReDim Preserve outer(1 To 3) ' 2 x 2 + 1 x 1
outer(3) = Array(5, 6) ' 3 x 2
Debug.Print (outer(3)(1)) ' > 6
End Sub
Jack Famous написал: А усекание "строк" (1ая размерность), определенных с запасом в двумерном массиве? Сейчас я просто считаю, сколько задействовано и выгружаю только эту часть массива, но всё же интересно...
написал: Здравствуйте! Подскажите как найти дубликаты емайл в диапазоне дат. В PQ удалось только найти общее количество повторений по адресам, на большее ума не хватило. Хотелось бы в сводной, в фильтре дат указывать нужный диапазон и получать какие адреса в этом диапазоне повторяются.
А что вы имеете ввиду под "найти дубликаты"? Чтобы в сводной таблице отображалось количество адресов, которые встречаются в текущем выбранном диапазоне более 1 раза?
Если нужно видеть не количество дубликатов, а видеть какие адреса повторяются, то достаточно просто вывести поле "email" в значения, чтобы считалось их количество и сортировать таблицу по убыванию этого количества. Все email с количеством больше 1 имеют дубликаты.
Попробовал через redim preserve - значения сохраняются (в комментариях указал результат, который выводится). Это не оно?)
Код
Sub pprint(arr)
pretty_string = ""
For i = LBound(arr) To UBound(arr)
pretty_string = pretty_string & i & ":" & arr(i) & ", "
Next i
Debug.Print (pretty_string)
End Sub
Sub Test()
Dim arr As Variant
ReDim arr(0 To 4) As Byte
For i = 0 To 4
arr(i) = i
Next
pprint (arr) ' 0:0, 1:1, 2:2, 3:3, 4:4,
ReDim Preserve arr(1 To 5)
pprint (arr) ' 1:0, 2:1, 3:2, 4:3, 5:4,
End Sub
написал: ну мне интересен этот момент, если честно)))Дайте несколько ссылок на VBA-реализацию, пожалуйста…Вспомнил пару вопросов про массивы - сейчас создам тему)
Пример какой-то такой (если система не 64х битная, то FillMemory объявляется по-другому - пример есть по первой ссылке выше).
Код
Private Declare PtrSafe Sub FillMemory Lib "kernel32" Alias "RtlFillMemory" (Destination As Any, ByVal Length As Long, ByVal Fill As Byte)
Sub StuffBArr()
' заполняем весь одномерный массив цифрой 13
Dim i(0 To 39) As Byte
FillMemory i(0), 40, 13
' заполняем 5-й элемент массива цифрой 13
Dim k(0 To 39) As Byte
FillMemory k(5), 1, 13
' заполняем весь трёхмерный массив цифрой 13
Dim j(1 To 2, 5 To 29, 2 To 6) As Byte
FillMemory j(1, 5, 2), 2 * 25 * 5, 13
End Sub
написал: Спасибо вам большое! Теперь то, что нужно и коды определяет корректно! Единственно в пустых ячейках до вставки билета как доработать формулу, чтобы не было ошибки #ЗНАЧ!
Оберните всю конструкцию ещё раз в ЕСЛИОШИБКА - например, вот так.
написал: Andrej730, благодарю! Интересная цепочка, конечно))) непрактично, но в качестве исследования - отлично Join привередливый к данным - потому так и не получается Вот так можно
Я ещё в интернете видел вариант, в котором элементы массива заполняются через FillMemory, где идёт запись напрямую в память и нужно указывать размер записываемого значения в байтах, но это совсем не для слабонервных, такое лучше в приличном обществе не показывать )
Ещё сейчас возникла идея сделать это через дополнительную функцию, но что-то выдаёт ошибку "Invalid procedure call or argument (Error 5)".
Код:
Код
Sub assign_array_element(ByRef arr As Variant, value_index, value)
arr(value_index) = value
End Sub
Sub ss()
Debug.Print Join(ff, vbLf)
End Sub
Function ff() As Variant()
ReDim ff(1 To 2)
Call assign_array_element(ff, 1, 11)
Call assign_array_element(ff, 2, 22)
End Function
У вас ошибка связана с тем, что ЛЕВСИМВ(A3;3) возвращает код в текстовом формате (даже если он состоит полностью из цифр), а в таблице кодов справа подобные цифровые коды имеют числовой формат - из-за несоответствия форматов ВПР не находит совпадение и выдаёт ошибку.
Для решения нужно либо учесть перевод в числовой формат в формуле, как предложил Ігор Гончаренко, либо перевести все коды в текстовый формат (для этого можно сцепить коды с пустой строкой по типу =G2 & ""). Но вообще перевод в числовой формат в формуле звучит надёжнее.
А в чём именно цель решения без дополнительных присвоений массивов? Если не хочется один и тот же массив держать в памяти дважды, то можно создавать его перед вызовом процедуры и передавать в процедуру ссылку на него, а там уже его заполнять. Таким образом он будет фигурировать в памяти только единожды.
Чтобы разобраться в проблеме нужно погружаться в сам макрос - желательно пройтись по шагам и проверить, какой ответ даёт сайт в ответ на запрос из макроса. Просто так по общему описанию получить дельный ответ на ваш вопрос не получится.
---------------------------
Microsoft Visual Basic for Applications
---------------------------
Compile error:
Function call on left-hand side of assignment must return Variant or Object
---------------------------
ОК Справка
---------------------------
Судя по ошибке, которую выдаёт VBA, - язык считает ff(1) за рекурсивный вызов функции, а не вызов 1 элемента массива. Значит, проблему можно решить используя какой-нибудь другой способ назначения элементов массива. Например, через
Код
ff = Array(11, 22)
Но в этом случае массив будет начинаться с 0 элемента, а не с 1, как у вас, если это имеет значение. Возможно, есть какой-то способ сдвинуть массив для решения или какие-то другие способы назначения элементов.
' As Array
Sub ss()
Debug.Print Join(ff, vbLf)
End Sub
Function ff() As Variant()
Dim temp_arr As Variant
ReDim temp_arr(1 To 2)
temp_arr(1) = 11
temp_arr(2) = 22
ff = temp_arr
End Function
написал: Какая программа должна открываться для просмотра pdf?
пока открываю хромом, какой бесплатный ридер порекомендуете? Работал на 3 мониках проблемы не было, сейчас с ноутом, все время нужно пдф скроллить, переключаться между доками,изматывает. Кое что из кода нагугил, попозже разберусь, от этого отталкиваться буду. Представление такое- есть папка на рабочем столе, содержащая пдф и эксель, оба файла открыты для работы, можно в коде прописать не конкретную папку ( название меняется) и не конкретный файл пдф (тоже меняется) а обратиться к активным в данный момент экселю и активному пдф, находящемуся в той же папке? в эксель 3 столбца: текст,номер страницы,( который редачится с каждым новым файлом пдф ), ссылка на пдф страницу под номером,взятым из предыдущего столбца.
Тогда вам нужен макрос, который выведет в excel пути до всех pdf-файлов в текущей папке, где находится excel-файл, а дальше сделать нужные вам ссылки по примеру выше.
ПРОИЗВЕД написал: Хотелось бы небольшой автоматизации.
действительно все зависит от того где файлы и чем просматриваются. например есть стандартный метод но он требует размещения на WEB ресурсе.
Необязательно размещать на web-ресурсе, достаточно вывести макросом в excel пути до pdf-файлов и сгенерировать из них ссылки по типу "file:///C:/document.pdf#page=5", которые откроются в браузере на нужной странице.
Вы точно указали правильные диапазоны? Сейчас он применяется к ячейке H5, а не H3. Если я правильно понял, то вы хотите протянуть его на диапазон H5:AJ5, но условное форматирование не срабатывает, так как формула УФ тоже смещается. То есть для ячейки I5 формула из-за смещения уже будет считаться как
Код
IFS(I3>=E5; I3<=F5)
Для решения вам нужно корректно закрепить столбцы и желательно ещё и строки, так как в будущем таблица, скорее всего, у вас будет расти вниз тоже. Как-то так:
Расчет расстояния между населенными пунктами VBA, Есть макрос который рассчитывает расстояние между двумя населенными пунктами, как сделать чтобы он вычислил расстояние по всей БД
Расчет расстояния между населенными пунктами VBA, Есть макрос который рассчитывает расстояние между двумя населенными пунктами, как сделать чтобы он вычислил расстояние по всей БД
Ушло какое-то время на дебаг, но я выявил проблему - судя по всему из-за древности Internet Explorer, который используется в качестве браузера, или в качестве защиты сайт иногда выдаёт ошибку с картинки ниже. Поэтому я добавил в макрос, чтобы он в случае ошибки пробовал выгрузить данные повторно, пока не получится.
Также добавил несколько принудительных ожиданий - при заходе на страницу, при клике на кнопку, при перезапуске, чтобы было надёжнее. В случае если нужно подгрузить очень много городов, то можно попробовать снизить время ожидания в коде (за это отвечают команды типа Sleep(5000) = ожидание на 5000 милисекунд).
Тогда можно добавить в файл функцию вроде этой, у Evaluate в VBA больше возможностей.
Код
Function ev(r As Range) As Variant
ev = Evaluate(r.Value)
End Function
Ещё есть вариант написать макрос, чтобы быстро вставлять рассчитанную формулу как значение и заменять в ней "=" на "=", в таком случае она сразу рассчитается.
Кажется, понял, что вам нужно. То, что вы ищете - это функция вычислить, в неё вы можете передать вашу формулу без "равно" в начале, и она её вычислит. Но с ней есть особенность - её нельзя просто так использовать в обычных ячейках, для её использования нужно создать именованный диапазон (Формулы -> Диспетчер имён -> Создать) и в нём в графе "Диапазон" вписать вашу формулу. Во вложении есть пример. Важный момент - файл с такой функции обязательно должен поддерживать макросы.
Максим В., заметил ошибку - в начале "данные!H136" без абсолютной ссылки по строкам. При этом ещё этот вариант не сработает для последней строки в списке - будет выдавать ЗНАЧ, т.к. конструкция "МИН(ЕСЛИ...))" будет выдавать "-1". Попробовал заменить ИНДЕКС(данные!G$2:G$136;МИН(ЕСЛИ(...))) на ЕСЛИОШИБКА(ИНДЕКС(данные!G$2:G$136;МИН(ЕСЛИ()));данные!G$136), что должно было бы помочь, но судя по всему ЕСЛИОШИБКА не способна возвращать ссылку на ячейку, а только значение, поэтому формула тоже не работает.
В итоге немного доработал, чтобы формула работала для всех случаев (наверное, можно придумать какое-нибудь более элегантное решение):