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

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 526 След.
Сбор данных из нескольких файлов
 
Цитата
написал:
Пока сам не могу разобраться в чем дело.
100% в этом:
Цитата
написал:
lLastRow = ThisWorkbook.Sheets(ЛистВставки).Cells(Rows.Count, ДиапазонВставки).End(xlUp).Row
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Извлечение цифр из строки, Извлечение цифр из строки
 
Как получить слово после последнего пробела
Код
=ПОДСТАВИТЬ(ПСТР(ПРАВСИМВ(" "&ПОДСТАВИТЬ(B2;"_";ПОВТОР("_";999));999*1);1;999);"_";"")
но это будет текст. Если необходимо в ячейку возвращать именно сумму числом - то пару символов надо добавить:
Код
=--ПОДСТАВИТЬ(ПСТР(ПРАВСИМВ(" "&ПОДСТАВИТЬ(B2;"_";ПОВТОР("_";999));999*1);1;999);"_";"")
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Макрофункция ВЫЧИСЛИТЬ() не обновляет значение автоматически
 
Добавьте в именованную формулу любую "летучую" функцию, которая не будет влиять на результат. Например, ТДАТА:
Код
=ВЫЧИСЛИТЬ(Лист1!$D$1)+(ТДАТА()*0)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Создать DLL (C++) для Excel 2016
 
А запрос в чем, если не надо учить языкам? В том, как написать DLL на C++? Без даже минимального обучения нужному языку рассказывать нечего :)
Цитата
A-Soft написал:
Обычные DLL не принимает Excel
а обычные - это какие? Насколько знаю, правильно написанная DLL(хоть на паскале) нормально подключается к той программе, под которую написана. Даже на VB можно это сделать(через грабли, но можно).
Или хотите такую, которая подключается просто двойным кликом по файлу?

P.S. Заказ не занимаю, если что. Просто любопытствую.
Изменено: Дмитрий(The_Prist) Щербаков - 21.01.2026 14:24:18
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Отказ в редактировании макроса, Изменение структуры макроса
 
Цитата
paulryler написал:
открытие нового процесса Excel
я Вас удивлю, но даже если бы это был не первый процесс - разные процессы работают независимо. Или Вы не понимаете смысла слова "процесс" в контексте Excel. Допустим, Вы запустили Excel. Это первый процесс - "экземпляр1". Вы создали в нем новую книгу. Теперь в "экземпляр1" кол-во книг = 1. Далее Вы идете в меню программ и запускаете еще раз Excel - это будет второй процесс - "экземпляр2". И на момент запуска в нем нет ни одной книги. Единственная открытая книга пока что только в "экземпляр1".
Подытожим: не важно, сколько там у Вас процессов - проверять наличие видимых открытых книг необходимо в том, в котором выполняется код. Т.е. в конкретном  экземпляре Application. Я бы делал так - проверял бы наличие видимых книг и если их нет - создавал.
Код
Sub НижПодч_Описание()
    Dim wb As Workbook
    Dim lc&
    'проверяем наличие видимых окон книг в текщем экземпляре
    For Each wb In Application.Workbooks
        If wb.Windows(1).Visible Then
            lc = lc + 1
        End If
    Next
    
    If lc = 0 Then
        Set wb = Workbooks.Add(1)
    End If
    Application.MacroOptions _
            Macro:="НижПодч", _
            Description:="Если ячейка не пустая, ставит '_' и текст", _
            Category:="MIT-Excel", _
            ArgumentDescriptions:=Array( _
                "ячейка для проверки", _
                "текст или ссылка на ячейку, которая будет отображаться как текст после '_'")
    'можно и закрыть, но я бы оставил - запустили надстройку и создается новая книга
    'это удобно и более правильно - пустое окно обычно всех пугает :)
    'но если хочется пустое окно - то раскомментируйте
'    If lc = 0 Then
'        wb.Close 0
'    End If
End Sub

wb.Close 0 - спорный момент. Я бы не закрывал. Первая причина в комментах(многих пугает серое окно). А вторая более глобальная: может получиться так, что кроме надстройки и этой книги других открытых в приложении не окажется. И тогда при закрытии последней книги в некоторых версиях Excel это спровоцирует закрытие приложения полностью.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Отказ в редактировании макроса, Изменение структуры макроса
 
Цитата
paulryler написал:
А в первых сообщениях вообще ничего не писали про добавление в код тех строк,
про добавление строк нет, а вот про открыта ли на момент работы макроса хоть одна видимая книга - да. А это значит, что при остановке кода на этих строках Вы должны убедиться, что на заднем фоне Excel видна книга и лист с ячейками, а не серый фон :) Надстройка хоть и книга - но она является скрытой: т.е. листы и ячейки по умолчанию скрыты от пользователя и книга не отображается среди всех обычных книг.
Но Вы же написали
Цитата
paulryler написал:
Книга открыта и видима с включенной надстройкой
что и ввело всех в заблуждение, включая Вас самого.
Да и агрессии никакой нет было - Вам просто указали на то, что вопрос был задан конкретный и ответ на него было получен утвердительный. Хотя судя по коду - это не так. Вот и все. Теперь  будете знать что такое ВИДИМАЯ книга :)
Изменено: Дмитрий(The_Prist) Щербаков - 21.01.2026 13:46:37
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Отказ в редактировании макроса, Изменение структуры макроса
 
Остается только предложить выложить сюда свою надстройку. Будем смотреть. Гадать дальше нет смысла.

Офф
Изменено: Дмитрий(The_Prist) Щербаков - 21.01.2026 12:35:18
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Отказ в редактировании макроса, Изменение структуры макроса
 
Цитата
paulryler написал:
оно не дает это сделать
оно - это кто? Если запущено из надстройки - проблем быть не должно. Хоть одна книга на момент работы этого макроса открыта и видима?
И уточните текст ошибки - точно такая же как в первом посте или может быть иная? Почему спрашиваю - описание к аргументам через MacroOptions появилось только в 2010 Excel и в более ранних версиях будет выдавать ошибку.
Изменено: Дмитрий(The_Prist) Щербаков - 21.01.2026 11:51:13
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Запуск макроса при изменении ListBox
 
Цитата
OlegO написал:
запускает UserForm с искомым ListBox
У Вас там ComboBox, а не ListBox. Об этом речь.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Вычисление автозаполнения через формулу при наличии критерия
 
Сделал для версий Excel от 2007. Столбец В:
Код
=ЕСЛИОШИБКА(ИНДЕКС('ВВОД ДАННЫХ!'!B$2:C$715;НАИМЕНЬШИЙ(ЕСЛИ(('ВВОД ДАННЫХ!'!J$2:J$715="Да");СТРОКА(A$2:A$715)-1);СТРОКА(A1));1)&" "&ИНДЕКС('ВВОД ДАННЫХ!'!B$2:C$715;НАИМЕНЬШИЙ(ЕСЛИ(('ВВОД ДАННЫХ!'!J$2:J$715="Да");СТРОКА(A$2:A$715)-1);СТРОКА(A1));2);"")

Столбец С:
Код
=ЕСЛИОШИБКА(ИНДЕКС('ВВОД ДАННЫХ!'!B$2:J$715;НАИМЕНЬШИЙ(ЕСЛИ(('ВВОД ДАННЫХ!'!J$2:J$715="Да");СТРОКА(A$2:A$715)-1);СТРОКА(A1));4);"")

остальные столбцы по аналогии.

Если версия более новая и есть функция ФИЛЬТР - то все намного проще:
Код
=ФИЛЬТР('ВВОД ДАННЫХ!'!B2:B715;'ВВОД ДАННЫХ!'!J2:J715="Да")&" "&ФИЛЬТР('ВВОД ДАННЫХ!'!C2:C715;'ВВОД ДАННЫХ!'!J2:J715="Да")
Изменено: Дмитрий(The_Prist) Щербаков - 20.01.2026 13:11:40
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Запуск макроса при изменении ListBox
 
Я бы делал чуть иначе. Заполняем листбокс так:
Код
Private Sub UserForm_Initialize()
    Dim am, xm, ad, lr&
    am = Array("восс-е исходных значений ДИ", "восс-е контекст. меню листа", "визуал-я 1 строки прихода", "отображение скрытых имен")
    ad = Array("Func_RecNM", "Func_RecCM", "Func_RecViz", "Func_ShowImen")
    For Each xm In am
        Me.Service_macros.AddItem xm
        Me.Service_macros.List(lr, 1) = ad(lr)
        lr = lr + 1
    Next
End Sub
'и просто при изменении берем нужный макрос из второго столбца Листбокса
Private Sub Service_macros_Change()
    ad = Service_macros.List(Service_macros.ListIndex, 1)
    Application.Run "'" & ThisWorkbook.Name & "'!" & ad
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Макросом записать в ячейку формулу, возвращающую написание формулы из другой ячейки и ее расчетное значение.
 
Цитата
dhead написал:
его и не нужно было бы определять: пользователь на своем компе вводит формулу в соответствии со своими региональными настройками
ну т.е. ничего Вы не поняли. Ок. Попробуем разжевать.
xlListSeparator - выдаст Вам точку-с-запятой. Но при этом RefersToLocal может его не принять и потребовать внутренний разделитель - т.е. запятую(как я показал в своем сообщении выше). И это при том, что вся формула будет написана на русской локализации, а разделитель аргументов в формулах в ячейках все та же точка-с-запятой.
Далее, даже если решились подменять разделители - представьте формулу вида:
"=СУММ(Лист;1!A1;Лист;1!A2)"
в чем проблема? выделил красным - имя листа содержит разделитель аргументов. Следовательно, простой Replace не сработает и надо будет парсить формулу. А это поверьте мне - дело весьма не благодарное.
Цитата
dhead написал:
Все точно так же будет работать с ячейками на временном листе
нет и еще раз нет. Во временный лист Вы переносите формулу именно так, как её требуется видеть в той локализации, в которой ведется работа. Не надо думать, какие там разделители требует RefersToLocal. А значит никакие разделители определять/подменять не надо. Надо просто объединить все в одну формул.
Просто попробуйте ту формулу, которую у Вас не принимает имя записать в лист через FormulaLocal. Не удивлюсь, что все запишется и будет вычислено корректно и без ошибок.
Цитата
dhead написал:
Полноценная книга со всей иерархией объектов ради одной ячейки
у Вас просто фантазии или опыта нет. Копии книги и листов лишь пара вариантов. Можно это делать и в отдельных пустых ячейках и даже(!) в уже заполненных. Просто надо понимать, в каких ячейках это можно делать, а в каких нет.
Дальше убеждать Вас в чем-то не вижу смысла - обсуждение заходит в тупик, Вам надо решение исключительно через диспетчер имен. И я почему-то уверен, что проблема именно в разделителе, хоть Вы и говорите, что пробовали его менять в формуле.
Изменено: Дмитрий(The_Prist) Щербаков - 20.01.2026 12:36:20
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Макросом записать в ячейку формулу, возвращающую написание формулы из другой ячейки и ее расчетное значение.
 
Цитата
dhead написал:
гадить в чужой лист временными ячейками с производственным мусором как-то некрасиво. Создавать\удалять или держать ради этого отдельный лист – тоже.
а имена создавать красиво? :) Ну не согласен с Вами. Если имена не справляются(а они могут не пропустить из VBA строку длиной более 255 символов) - то чем плохо использование отдельного скрытого листа для таких целей? Чем он хуже создания имени с кучей нюансов? А на листе можно все эти формулы просто соединить и получить готовый вариант. Вот не понимаю я таких манипуляций. Тем более работа идет через форму - при запуске формы создали книгу, скрыли её(wb.Windows(1).Visible = False) и работайте на её листе. Перед закрытием формы - просто закрываете без сохранения и никаких следов. Ну или в самой книге либо держать отдельный скрытый лист, либо создавать и удалять. Опять же - только на время работы формы.
Ладно бы вообще нельзя было использовать листы - но ведь можно, раз можно использовать имена. Так зачем себе жизнь усложнять?  :)
Цитата
dhead написал:
Все перепробовал, не помогает.
а разделитель пробовали менять? Вот так:
Код
With ThisWorkbook.Names.Add("testname2", RefersTo:="=СУММ(Лист1!$A$1,Лист1!$A$2)")
    .RefersToLocal = "=СУММ(Лист1!A1,Лист1!A2)"
End With

Я об этом в первом своем сообщении намек делал - видимо, он не достиг цели :) это опять к слову о том, что диспетчер имен хоть и воспринимает русские названия функций, но живет по своим законам...Вот и подумайте - сможете корректно определить именно разделители аргументов для каждой произвольной функции/формулы, взятой из ячейки? А точно уверены, что у всех пользователей именно тот разделитель, который Вы считаете разделителем? Ведь у кого-то это может быть и точка-с-запятой, а у кого-то - запятая.
Изменено: Дмитрий(The_Prist) Щербаков - 19.01.2026 15:43:38
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Макросом записать в ячейку формулу, возвращающую написание формулы из другой ячейки и ее расчетное значение.
 
Если честно - плохо понимаю вообще смысл этого действия. Здесь ошибок может быть куча: начиная от разделителей и заканчивая грамматикой. Все это может быть вперемешку и никакие FormulaLocal не разберутся, что так кто написал.
А если учесть, что применяются только встроенные функции(без всяких там UDF самописных) - то вообще не ясна цель изврата. В Excel более чем вменяемый Мастер функций, который позволяет набирать вложенные и иные функции точно так же, только со всеми проверками "из коробки".
Цитата
dhead написал:
Использовать для этого временную ячейку на листе кажется не очень правильным
и между тем это самый рабочий вариант. Раз работа через макросы - то проблем в этом не вижу. Хоть на временном листе, хоть на копии текущего это можно записывать. И будет куда стабильнее и более наглядно при отладке, чем через имена.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Ключу не соответствует ни одна строка в таблице., Помогите разобраться
 
Цитата
AlienSx написал:
имя листа и имя таблицы все же могут совпадать
а, не так понял. Да, в этом плане согласен полностью.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Ключу не соответствует ни одна строка в таблице., Помогите разобраться
 
Цитата
AlienSx написал:
Как предугадать что получает индекс (скажем, имя листа или имя таблицы) - я не знаю
имя листа или таблицы не могут иметь в пределах одной книги одинаковые значения.
А вот имена - могут. Можно создать два одинаковых имени(например, "имя_диап") на двух разных листах, если области действия у них будут отличаться(одно имя имеет область действия "Лист1", второе - "Лист2"). И при этом можно добавить еще одно такое же имя, но уже с областью действия "Книга". И все три имени с одинаковыми названиями будут прекрасно уживаться в книге. Просто для имен с областью действия лист добавляется имя листа, на котором действует имя. Поэтому в PQ поле "Item" изначально не может содержать двух одинаковых значений для одной книги - но это из-за требований к структуре самой книги, PQ здесь по сути не при делах. И при этом в такой ситуации двум из трех имен в поле "Name" PQ добавит индекс: "имя_диап1" и "имя_диап2", т.к. Name тоже не может иметь дубликатов в пределах одной книги :) Это уже законы PQ. Порядок индексации напрямую зависит от того порядка, в каком имена расположены в диспетчере имен, независимо от того, в каком порядке имена создавались.

Для рассматриваемых выше трех одинаковых имен внутри одной книги запись будет примерно такой:
NameItem
имя_диапЛист1!имя_диап
имя_диап1Лист2!имя_диап
имя_диап2имя_диап
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Вывод значения ячейки в отдельный графический элемент
 
Ничего не понятно, но очень интересно. Соглашусь, что без примера в файле Excel здесь только гадать чего Вы хотите. Откуда "флажок" должен брать значения для этих подписей? Где должны выводиться сами подписи?
Возможно, это получится реализовать при помощи доп.ячеек и фигур. Но это только предположения - без более конкретных пояснений на примере с данными гадать нет желания.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Выбор значения из массива по критериям
 
Цитата
kdi написал:
в голове не укладывается "суммирование слов" в ячейке
вот здесь описывал как это работает(функция другая, но принцип полностью тот же): Суммирование по двум и более критериям - версии до 2007 Excel
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
DateValue - Type Mismatch - как починить?, vba
 
Цитата
sokol92 написал:
В частности, п. 3.6, не следует использовать функции VBA, которые зависят от региональных настроек (DateValue в их числе)
DateValue  там не упоминается, кстати. Но упоминается Format, с которой все не так однозначно :)
Она да, опирается на локализацию, но только в том случае, если первым аргументом передан текст, а не числовое значение или значение даты. И/или если второй аргумент опущен.
Если первый аргумент строка - то будет попытка преобразования строки в числовой тип. И здесь да, играет роль локализация и региональные настройки.
Если же первый аргумент число или дата(или уже преобразованная строка), но второй аргумент опущен - то будет выдан формат по умолчанию для чисел/дат, определенный региональными настройками.
Но если первый аргумент число или дата и второй аргумент задан - функция отформатирует первый аргумент в ожидаемое строковое значение, заданное этим форматом.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
DateValue - Type Mismatch - как починить?, vba
 
Цитата
KUDRIN написал:
например какой код в этом треде выдаст стабильно дату #14/01/2026#? или #14.01.2026# ? без дня недели
никакой. И ни один из Ваших, без перевода в текст. Только это уже будет не дата "#14/01/2026#", а текст "14/01/2026". И это разные вещи. Как раз решетки в Watches указывают на то, что в переменной храниться тип даты. Я уже писал, что DateValue при этом тоже вернет дату с днем недели, т.к. это задано региональными настройками. А DateValue возвращает НЕ ТЕКСТ, а ДАТУ. Вы просто почему-то этого не хотите слышать, видеть, воспринимать.
Вы вообще можете прямо в коде записать:
Код
a = #14/01/2026#

а потом сразу же в Watches обнаружите, что туда день недели добавился откуда-то :)
И считаете, что понимание типов данных здесь не при чем. Ну да ладно, Ваше дело.
Цитата
KUDRIN написал:
чем текстовая "14/01/26" ЗНАЧИТЕЛЬНО хуже датированной "#среда 14/01/2026 по лунному календарю#"
не знаю. Это Вы хотите именно через DateValue получать дальше текст, а не я. Я изначально задавал вопрос - зачем эти танцы с бубном через не самую стабильную функцию.
Цитата
KUDRIN написал:
c = Format("14/01/2026")
тоже выдаёт "Ср 14.01.2026", но уже в виде строки а не даты
ну это логично. Потому что слеш имеет вполне себе служебное значение - он является неким обозначением регионального разделителя дат, независимо от разделителя в системе. Хотя не очень понял смысл приведенной записи - там ничего не форматируется, а текст "14/01/2026" на лету внутри Format конвертируется в дату и ему не назначается никакой формат :) Ну или чего-то в строке не хватает(либо формата, либо самой даты).
А если записать так:
Код
Format("14/01/2026","dd.MM.yyyy")

то получите вполне ожидаемое: "14.01.2026"
Еще можете попробовать так:
Код
Format(date,"dd\/MM\/yyyy")

или так(если лень разбираться со служебными символами:
Код
Replace(Format$(Date, "dd.MM.yyyy"),".","/")

в этих вариантах день недели должен отсутствовать, если его явно не указать в строке формата:
Код
Replace(Format$(Date, "ddd dd.MM.yyyy"),".","/")

Цитата
KUDRIN написал:
я лишь дал один из вариантов обработки
обработки чего? Это тоже не мешает указать, т.к. пока что Вы просто показали, как объединить в текст год, месяц и день(ну и часы с минутами). А для чего это все? В чем смысл таких манипуляций - пока никому не известно. А следовательно бесполезно для всех, кроме вас, по своей сути.
Я вообще не понимаю зачем переводить в текст реальные даты для дальнейшей работы с ними. Обычно наоборот все пытаются сделать...

P.S. Что это за функции такие в Excel, которые с датами отказываются работать? Может они не должны с датами работать, а с текстом?
Изменено: Дмитрий(The_Prist) Щербаков - 14.01.2026 18:32:35
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
DateValue - Type Mismatch - как починить?, vba
 
Цитата
KUDRIN написал:
вывод будет с такой текстовой
Вы серьезно? Т.е. Вы рассказываете, что нужна именно DateValue, которая если и преобразует текст в дату - выглядеть она будет точно так же - с днем недели(ибо локаль). Однако потом все это выводите в текст. Вы уверены, что для Вас не имеет значения ответ на вопрос - зачем это все? У меня другой вопрос назрел: Вы точно понимаете, что то, что Вы выводите в Immediate - это просто текстовый вид даты? Но от этого сама переменная не перестает быть датой и с ней можно работать как с датой без всяких конвертаций? И есть специальные функции, переводящие правильные даты в любой нужный формат. Та же Format:
Код
c = Format("dd/MM/yyyy")

и никаких там Day и прочих выдумок.
Нет, я еще понимал Вас, когда надо было отсечь время. Но это...Это уже где-то за гранью моего понимания без ответов на очевидные вопросы.
Изменено: Дмитрий(The_Prist) Щербаков - 14.01.2026 17:44:40
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
DateValue - Type Mismatch - как починить?, vba
 
Это ожидаемо, я так и написал. У Вас все даты будут так отображаться. Почему? См.выше :)
Ну а так - у меня-то был один-единственный не раскрытый вопрос: почему именно не стабильная DateValue, которая сильно зависит от локали. На него ответ по сути получен следующий: потому что. Более стабильные варианты преобразований почему-то не воспринимаются. Почему? Никто не знает, а Вы не говорите. А понимать тот факт, что любая дата будет отображаться при переводе в текст "как есть" именно как она в локали - Вы почему-то тоже не хотите.
А значит дальше обсуждать в итоге нечего(лично для меня) - проблема определена, решения по работе именно через DateValue искать Вам, т.к. это будут решения под каждый вид настроек даты на ПК.
Изменено: Дмитрий(The_Prist) Щербаков - 14.01.2026 17:37:16
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
DateValue - Type Mismatch - как починить?, vba
 
Цитата
KUDRIN написал:
этот код сохраняет день недели в своём результате
да, потому что так установлено региональными настройками локали. И это нормально. Но с этой переменной можно спокойно работать как с датой. Впрочем, как и с переменной a.
Даже больше можно сказать - попробуйте такой код:
Код
a = Date

Есть подозрение, что и там будет фигурировать день недели, ибо...см. выше - локаль.
Как Вы писали выше - вопрос "зачем" это все надо не рассматривается, поэтому его не задаем и варианты предлагаем из своих додумок.
Изменено: Дмитрий(The_Prist) Щербаков - 14.01.2026 17:09:23
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
DateValue - Type Mismatch - как починить?, vba
 
МатросНаЗебре, а зачем вот это вот все в принципе? Переменная а уже является датой и временем. Если уж захочется получить все не через int - есть же другие функции, куда более стабильно работающие вне зависимости от локализации и форматов:
Код
Sub test()
Dim a As Date, b As Boolean, c As Date, ct As Date
a = FileDateTime("C:\Windows\notepad.exe")
b = IsDate(a)
c = DateSerial(Year(a), Month(a), Day(a))
ct = TimeSerial(Hour(a), Minute(a), Second(a))
End Sub

другой вопрос, если мы берем не FileDateTime, а какой-то текст, который может представлять дату. Но это уже совсем другая история и решить её одним кодом без вводных данных точно не получится.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
DateValue - Type Mismatch - как починить?, vba
 
Цитата
KUDRIN написал:
за столько лет такой ошибки ни у кого не возникало?
возникали. Написали уже - локализация. У Вас запись даты включает в себя день недели в кратком формате("Ср 14.01.2025"). И этот формат даты никак не может быть преобразован из VBA через DateValue, потому что - см.выше. DateValue всегда работает с текстом и если передали не текст - то пытается в текст преобразовать и преобразовывает "как есть", т.е. в "Ср 14.01.2025". А такой текст не является допустимым в VBA.
Вы IsDate неверно использовали, если хотели проверить, допустим ли полученный формат даты в DateValue. Попробуйте так:
Код
b = IsDate(Cstr(a))

уверен, что выдаст False.

И это не единственный формат, который может "не понравиться" VBA. Поэтому я и предложил работать через Int, как наиболее универсальное средство, которое не несет в себе по сути никаких подводных камней.
Изменено: Дмитрий(The_Prist) Щербаков - 14.01.2026 15:18:19
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Выделение дублей с учетом иерархии, Выделение дублей с учетом иерархии
 
Если допускается применение макросов хотя бы для приведения таблицы в плоский вид - тогда можно еще как-то решить. Иначе - полагаю, только ручками или разбираться с Power Query(там встроенной возможности разобрать структуру нет, но есть решения).
Ну или сторонние программы использовать.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
DateValue - Type Mismatch - как починить?, vba
 
Цитата
KUDRIN написал:
если нужен персональный скрин и слов недостаточно, то пожалуйста
я бы верил на слово, если бы код был предоставлен без всяких добавок в виде CStr, а не тот, который в скрине. При том скрин явно не повествует о том, на какой же строке ошибка. Т.е. сами наводите мороки и каши с кодами, а потом еще раздражаетесь, что Вас кто-то где-то не так понял. Вообще без проблем - мне Ваше персональное внимание не нужно, у меня код ошибок вообще не выдает. Просто было желание помочь, отсюда и подобные вопросы с желанием увидеть именно предложенный вариант с ошибкой, а не что-то опять на коленке написанное.
Цитата
KUDRIN написал:
вопрос был не в конвертации дат, а вопрос темы - причина ошибки и как эту ошибку полечить
самое правильное - как раз как я показал - в любой локализации сработает без ошибок. На мой взгляд это самое правильное "лечение". Если думаете, что DateValue ничего никуда не конвертирует - Вы ошибаетесь. Эта функция сначала конвертирует входное значение в текстовое выражение, и уже только после этого полученный текст - в значение даты. Именно поэтому я и сделал в самом первом посте упор на локализацию. Потому что DateValue(a) будет всегда от неё зависеть и этот метод весьма не надежен. Он нужен только если изначально работаете с явным текстом и то - лучше отказаться, если не понимания, какие виды этого самого текста могут быть в итоге. А вот Int - это куда ближе при работе с датами, чем DateValue, т.к. любая дата это в первую очередь число и как раз такие методы куда быстрее и корректнее обработают даты.
Даже достучавшись до причины ошибки(явно что-то в локали) - что делать будете на тех ПК, где на эти настройки повлиять не можете? Заставлять пользователей настройки менять?
Цитата
KUDRIN написал:
я умею пользоваться Ctrl+F9 , ещё вопросы?
нет, откуда? Я вижу у Вас и без моих советов и вопросов все отлично. Удачи!
Изменено: Дмитрий(The_Prist) Щербаков - 14.01.2026 14:51:18
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
DateValue - Type Mismatch - как починить?, vba
 
Цитата
KUDRIN написал:
ни c1 ни c2 не отрабатывает
ага, и при этом переменна b = true, а переменная a = реальная дата. И типы переменным Вы так и не назначили, оставив их как есть. Даже больше скажу - приложили Вы скрин с ошибкой, которая возникла на строке:
Код
c1 = DateValue(SCtr(a))

до с2 дело даже не дошло. В чем смысл проверки с2, если Вы даже не дошли до назначения ей значения?
Цитата
KUDRIN написал:
чтобы вместо каши получить нормальную дату, или время
Код
Sub test()
Dim a As Date, b As Boolean, c As Date, ct As Date
a = FileDateTime("C:\Windows\notepad.exe")
b = IsDate(a)
c = Int(a)
ct = a - c
End Sub
Изменено: Дмитрий(The_Prist) Щербаков - 14.01.2026 14:18:31
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
DateValue - Type Mismatch - как починить?, vba
 
А зачем вообще применять DateValue к данным, которые и так являются датой? FileDateTime возвращает именно дату в формате даты, а не текст.
Проблемы могут возникнуть на разных локализациях, если переменная а имеет тип String. Попробуйте задать типы явно:
Код
Sub test()
Dim a as date, b as boolean, c as date
a = FileDateTime("C:\Windows\notepad.exe")
b = IsDate(a)
c = DateValue(a)
End Sub
Изменено: Дмитрий(The_Prist) Щербаков - 14.01.2026 13:53:18
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Сбор данных из таблиц с разными шапками и количеством столбцов в шапке (PQ)
 
Собрать данные с таблиц с изменяющимися столбцами в PowerQuery
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 526 След.
Наверх