Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
VBA. Не срабатывает формат ячейки
 
Дмитрий(The_Prist) Щербаков, функция вводится руками. Как раз весь смысл был в том, чтоб формат ячейки не настраивать потом вручную и чтоб делать это не с помощью отдельного кода :)
VBA. Не срабатывает формат ячейки
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
надо полагать, вызывается она с листа? Т.е. это UDF?
Всё верно. Т.е. получается вернуть процентный формат никак по-другому нельзя? Функция FunctionPercen, не подойдёт, т.к. возвращает строку.
VBA. Не срабатывает формат ячейки
 
Доброго времени суток. Есть простой код, который включает в себя форматирование выделенной ячейки, из которой была вызвана функция. Но форматирование, по какой-то причине, сработало ровно 1 раз. После этого vba начал проходить этот код, но перемтал применять формат.

Код
Function ДОЛЯ (Доля As Double, От As Double)
ДОЛЯ = Доля / От
Доля_формат
End Function 

Sub Доля_формат()
Selection.NumberFormat = "0.00%"
End sub
Ячейка в которую возвращается результат пользовательской функции
 
Ок, возможно действительно что-то сторонее мешает или из-за разницы в версиях эксель. Пробую с другой стороны зайти, но тоже сталкиваюсь с проблемой. Пытаюсь в аргумент передать диапазон вида "A:A&B:B", вижу что эксель формирует массив, но почему-то аргумент функции не хочет принимать этот массив. Если же выделить конкретные ячейки, например, "A1&B1", то никаких проблем не возникает.
Собственно вопрос, как в функцию вида

Код
Function test(lookup_array)


передать массив полученный от обьединения двух дапазонов "A1&B1"?
Ячейка в которую возвращается результат пользовательской функции
 
На примере обычного ВПР, последовательность действий в 2х скринах. Т.е. если аргументы заполнить таким образом, то происходят эти непонятные перемещения.
Ячейка в которую возвращается результат пользовательской функции
 
Да вопрос не в сложности, я уже по всякому пробовал. Вопрос в том, что я вызываю функцию, допустим, из ячейки на листе 2 и пытаюсь получить данные с листа 1. Она отрабатывает, но результат записывает не в ячейку на листе 2, откуда она была вызвана, а в ячейку на листе 1. Причем происходит это только если аргументы функции заполнять через мастер функций.
Ячейка в которую возвращается результат пользовательской функции
 
Код
Function ВПР_тест(Где_ищем As Variant, _
                Условие_1 As Variant, Массив_условий_1 As Variant, _
                Optional Условие_2 As Variant, Optional Массив_условий_2 As Variant, _
                Optional Условие_3 As Variant, Optional Массив_условий_3 As Variant, _
                Optional Условие_4 As Variant, Optional Массив_условий_4 As Variant, _
                Optional Условие_5 As Variant, Optional Массив_условий_5 As Variant)
'======================================
look_book = Где_ищем.Parent.Parent.Name
look_list = Где_ищем.Parent.Index
look_mass_1 = Массив_условий_1.Address
If IsMissing(Массив_условий_2) Then
    look_mass_2 = Массив_условий_1.Address
    Условие_2 = Условие_1
Else
    look_mass_2 = Массив_условий_2.Address
End If

If IsMissing(Массив_условий_3) Then
    look_mass_3 = Массив_условий_1.Address
    Условие_3 = Условие_1
Else
    look_mass_3 = Массив_условий_3.Address
End If

If IsMissing(Массив_условий_4) Then
    look_mass_4 = Массив_условий_1.Address
    Условие_4 = Условие_1
Else
    look_mass_4 = Массив_условий_4.Address
End If

If IsMissing(Массив_условий_5) Then
    look_mass_5 = Массив_условий_1.Address
    Условие_5 = Условие_1
Else
    look_mass_5 = Массив_условий_5.Address
End If

Set Массив_условий_1 = Workbooks(look_book).Sheets(look_list).Range(look_mass_1)
Set Массив_условий_2 = Workbooks(look_book).Sheets(look_list).Range(look_mass_2)
Set Массив_условий_3 = Workbooks(look_book).Sheets(look_list).Range(look_mass_3)
Set Массив_условий_4 = Workbooks(look_book).Sheets(look_list).Range(look_mass_4)
Set Массив_условий_5 = Workbooks(look_book).Sheets(look_list).Range(look_mass_5)

'======================================

Set fst_found_cell = Массив_условий_1.Find(Условие_1, lookat:=xlWhole)
fst_found_cell_row = fst_found_cell.Row
start_found_address = fst_found_cell.Address


scnd_found_cell = Массив_условий_2(fst_found_cell_row)
thrd_found_cell = Массив_условий_3(fst_found_cell_row)
frth_found_cell = Массив_условий_4(fst_found_cell_row)
fth_found_cell = Массив_условий_5(fst_found_cell_row)

Do
    If CStr(scnd_found_cell) = CStr(Условие_2) And CStr(thrd_found_cell) = CStr(Условие_3) And CStr(frth_found_cell) = CStr(Условие_4) And CStr(fth_found_cell) = CStr(Условие_5) Then
        ВПР_тест = Где_ищем(fst_found_cell_row)
        Exit Do
    Else
        Set fst_found_cell = Массив_условий_1.Find(Условие_1, lookat:=xlWhole, after:=fst_found_cell)
        fst_found_cell_row = fst_found_cell.Row
        fst_found_cell_address = fst_found_cell.Address

        scnd_found_cell = Массив_условий_2(fst_found_cell_row)
        thrd_found_cell = Массив_условий_3(fst_found_cell_row)
        frth_found_cell = Массив_условий_4(fst_found_cell_row)
        fth_found_cell = Массив_условий_5(fst_found_cell_row)
    End If
Loop While start_found_address <> fst_found_cell_address

End Function


Код находился в файле надстройки, чтоб можно было запускать функцию из любой открытой книги. Принцип действия аналогичный с ИНДЕКС+ПОИСКПОЗ. Обособленный знаком "=" кусок - это уже эксперименты, думал может надо явно адрес книги и листа передавать как-то, что результат не перепрыгивал на другой лист.
Ячейка в которую возвращается результат пользовательской функции
 
Всем доброго времени суток. Столкнулся с проблемой при написании пользовательской функции. Функция, если её вызвать через "=" в ячейке, а затем воспользоваться мастером функций для передачи ей аргументов, записывает результат не в ту ячейку из которой она была вызвана, а в ячейку на соседнем листе. При этом, если ей передать аргументы не через мастер функций, то результат она записывает куда надо. Может кто-то сталкивался с таким и знает в чем может быть причина такого поведения?
Запросы в Access
 
Доброго времени суток.
Может кто-то работал с запросами SQL в Access. Создал тестовую базу, пытаюсь добавить в таблицу (sells) запись на основании данных другой таблицы (employers) с помощью следующего запроса:

Код
INSERT INTO sells(worker, product, price, quantity)
VALUES((SELECT fstName & " " & lstName FROM employers WHERE idEmploy = 7), Дача, 525623, 1);


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

Код
SELECT fstName & " " & lstName FROM employers WHERE idEmploy = 7


выполняется без проблем. Может кто-то подскажет что я упускаю?
VBA присвоение конкретного элемента из выборки xml
 
Благодарю. Оба варианта рабочие.
VBA присвоение конкретного элемента из выборки xml
 
Друзья, помоги разобраться как присвоить переменной конкретный элемент xml из выборки.
Я получаю набор всех элементов (выборку), из xml файла, с помощью следующего кода:
Код
Set xmlSelect = xmlDoc.GetElementsByTagName("Quantity")

Допустим в неё входят 2 элемента. Как мне дальше присвоить любой переменной один из этих элементов, чтоб потом работать с его атрибутами? В Гугле что-то совсем не получается найти.
Разная скорость работы кода VBA
 
В целом тему можно закрывать или отправлять в архив, решение нашел.
Достаточно было вначале работы макроса отключить изменение внешнего видакурсора
Код
application.cursor = xlwait '\или любой другой статичный вид курсора 
а потом включить его
Код
application.cursor = xldefault

Никогда бы не подумал что мелькание курсора жрёт столько времени.

Всем спасибо за советы и рекомендации.

Разная скорость работы кода VBA
 
Цитата
 написал:
чего вы добиваетесь этим?
Ищу нужную запись в именованной таблице. Параметр Row там, конечно же лишний, видимо остался от экпериментов.
Разная скорость работы кода VBA
 
Цитата
написал:
чтобы не было "каракулей", устанавливайте переключатель раскладок клавиатуры в "RU" перед копированием текста программы в буфер обмена.
Спасибо, запомнил.
Разная скорость работы кода VBA
 
Цитата
написал:
А какой кусок кода тормозит? Где MARKA_CODE определяете? Больше вроде и негде...
Тормозит вообще вся эта функция. Это только часть макроса из нескольких процедур и функций, но тормозит конкретно она, замерял через Timer.
MARKA_CODE как раз не сильно много перебора делает, там 3 строчки всего.
А вот в этих 2х моментах:
Код
Set SHIFR = .Range("Îñíîâíûå_ïðèâÿçêè[Øèôð ñìåòû]").Rows.Find(CHISTII_CODE)
и
Код
Set SHIFR = .Range("Îñíîâíûå_ïðèâÿçêè[Øèôð ñìåòû]").Find(MARKA_CODE)
 

как раз происходит основной перебор, там по 32 тысячи строк. Пробовал их загонять в массив, как и перебор MARKA_CODE, ничего не меняется.

Да и в целом вопрос в том почему один и тот же код, без вообще каких либо изменений, при активном окне Экселя выполняется в 10 раз дольше чем при активном окне VBA

Разная скорость работы кода VBA
 
Как обещал, кусок кода, который "тормозит". Там где каракули - это всё ссылки на именованные таблицы в рабочей книге. Скажу сразу, пробовал делать всё то же самое, но загоняя информацию из таблицы в переменную массива, на времени это отразилось в пределах погрешности. И ещё, заметил, что время работы зависит, всё же, не от того откуда запускать, а от того какое окно активно. Т.е. если запустить код из Эксель, то он отработает за 46 сек., а если запустить из Эксель и потом сделать активным окно среды разработки, то отработает за 4 сек. Собственно это навело на мысль, может в настройках самого Экселя где-то какая-то галочка, например безопасности, стоит?
Код
Private Function PRIVYAZKA_KQ(ByVal CODE As Variant, ByVal PRIZNAK As String, ByVal IMYA_SMETI As String) As String()
Dim DANNIE(4) As String
Dim CHISTII_CODE As String
Dim i As Integer
Dim DLINA_CODA As Integer
Dim SHIFR As Range
Dim SPISOK_MAROK As Range
Dim MARKA As Range
Dim MARKA_CODE As String

If PRIZNAK <> "Ðàáîòà" Then
    DANNIE(1) = ""
    DANNIE(2) = ""
    DANNIE(3) = ""
    DANNIE(4) = ""
    PRIVYAZKA_KQ = DANNIE
    Exit Function
Else
    i = 1
    CHISTII_CODE = Mid(CODE, i, 1)
    Do While (Not IsNumeric(CHISTII_CODE)) And (CHISTII_CODE Like "[À-ß]")
        i = i + 1
        CHISTII_CODE = Mid(CODE, i, 1)
    Loop
    DLINA_CODA = Len(CODE)
    CHISTII_CODE = Right(CODE, DLINA_CODA - i + 1)
    With Sheets("Ïðèâÿçêè")
    Set SPISOK_MAROK = .Range("Ñïåöèàëüíûå_ìàðêè[Ìàðêè]")
    For Each MARKA In SPISOK_MAROK
        If IMYA_SMETI Like "*" & MARKA.value & "*" Then
            MARKA_CODE = CHISTII_CODE & MARKA.value
            Exit For
        End If
    Next
    Set SHIFR = .Range("Îñíîâíûå_ïðèâÿçêè[Øèôð ñìåòû]").Find(MARKA_CODE)
    If SHIFR Is Nothing Then
        Set SHIFR = .Range("Îñíîâíûå_ïðèâÿçêè[Øèôð ñìåòû]").Rows.Find(CHISTII_CODE)
        If SHIFR Is Nothing Then
            DANNIE(1) = "Íåò ïðèâÿçêè"
            DANNIE(2) = ""
            DANNIE(3) = ""
            DANNIE(4) = ""
            PRIVYAZKA_KQ = DANNIE
        Else
            DANNIE(1) = .Range("Îñíîâíûå_ïðèâÿçêè[Êîä KQ]").Rows(SHIFR.Row - 1).value           '\"-1" Ïîòîìó ÷òî çàãîëîâîê òàáëèöû íå âõîäèò â ìàññèâ
            DANNIE(2) = .Range("Îñíîâíûå_ïðèâÿçêè[Íàèìåíîâàíèå KQ]").Rows(SHIFR.Row - 1).value
            DANNIE(3) = .Range("Îñíîâíûå_ïðèâÿçêè[Eä. èçì]").Rows(SHIFR.Row - 1).value
            DANNIE(4) = .Range("Îñíîâíûå_ïðèâÿçêè[Êîýôôèöèåíò âëèÿíèÿ]").Rows(SHIFR.Row - 1).value
            PRIVYAZKA_KQ = DANNIE
        End If
    Else
        DANNIE(1) = .Range("Îñíîâíûå_ïðèâÿçêè[Êîä KQ]").Rows(SHIFR.Row - 1).value
        DANNIE(2) = .Range("Îñíîâíûå_ïðèâÿçêè[Íàèìåíîâàíèå KQ]").Rows(SHIFR.Row - 1).value
        DANNIE(3) = .Range("Îñíîâíûå_ïðèâÿçêè[Eä. èçì]").Rows(SHIFR.Row - 1).value
        DANNIE(4) = .Range("Îñíîâíûå_ïðèâÿçêè[Êîýôôèöèåíò âëèÿíèÿ]").Rows(SHIFR.Row - 1).value
        PRIVYAZKA_KQ = DANNIE
    End If
    End With
End If
End Function
Разная скорость работы кода VBA
 
Цитата
написал:
Приложите файл с таким макросом.
К сожалею, файл приложить не смогу, т.к. всё это делается на рабочем ПК, на котором есть некоторые ограничения в плане интернета и пересылки файлов почтой. Попробую позже воспроизвести часть кода в котором, как я думаю, заключается проблема при разных запусках.
Кстати, если посоветуете как можно замерить время работы конкретной процедуры или функции тоже буду благодарен.
Разная скорость работы кода VBA
 
Всем доброго времени суток.
Недавно начал осваивать такую вещь как написание макросов на VBA  и столкнулся со следующей проблемой. Один и тот же макрос выполняется с разной скоростью при запуске его из среды разработки VBA при помощи кнопки run и из панели инструментов разработчик/макросы.
Соответственно, если запускаю из среды разработки, то макрос выполняется за 4 секунды, а если запускаю его из рабочей книги при помощи вкладки разработчик/макросы, то он уже выполняется за 46 секунд.
Код один и тот же, ничего в нём не меняется, ПК один и тот же, обновление экрана и пересчёт формул отключал. Единственный параметр, который меняется это то, откуда я запускаю код. Может кто-то сталкивался с этим и может подсказать в какую сторону копать?
Заранее прошу прощения, если подобная тема была, но в поиске не наше ничего похожего.
Страницы: 1
Loading...