Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.77/64: Рейтинг темы: голосов - 64, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 24.01.2017
Сообщений: 7

Формирование даты (месяца) VBA

01.06.2017, 09:18. Показов 13572. Ответов 37

Студворк — интернет-сервис помощи студентам
Здравствуйте, прошу помочь с написанием кода. Необходимо в выделенной ячейке задать месяц в виде "Февраля, Марта, Июня" Basic не учил, пользуясь знаниями синтаксиса других языков написал с горем пополам программу, но она не работает. Что не так?

Visual Basic
1
2
3
4
5
6
7
8
9
10
Private Sub CommandButton1_Click()
    Dim x As String
    Dim Lenx As Integer
    f1 = Month(Date)
    x = MonthName(f1, False)
    Lenx = Len(x)
    If (x.chars(Lenx) = "ü") Or (x.chars(Lenx) = "é") Then x.chars(Lenx) = "ÿ"
    Else: x.chars(Lenx + 1) = "à"
    ActiveCell.FormulaR1C1 = x
End Sub
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.06.2017, 09:18
Ответы с готовыми решениями:

Определение даты и месяца в VBA
nado chtobi kogda vedem mesyas, sifru 5 na drugoy yacheyke bilo pokazano posledenee chislo etogo mesysa vot tak : 31.05.05

Смена месяца. Работа с форматом даты.
Добрый день, у меня такой вопрос: Есть 30(29)/31 (в зависимости от месяца) ячейка, в каждой записана дата в формате dd.mm.yy. ...

Проверка месяца в дате через VBA
Здравствуйте уважаемые форумчане! Подскажите пожалуйста, не могу понять: В ячейках на листе есть даты в формате ДД.ММ.ГГ, как мне...

37
 Аватар для pashulka
4139 / 2243 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
03.06.2017, 13:10
Студворк — интернет-сервис помощи студентам
Что касается сомнительности, то это вопрос спорный ...

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Private Sub Test()
    MsgBox convEngToDate("1 Feb 2007")
    MsgBox convEngToDate2("15 Dec 14")
    MsgBox convEngToDate3("9 May 1941")
End Sub
 
Private Function convEngToDate(t$) As Date
    Dim m$, i%
    m = "JanFebMarAprMayJunJulAugSepOctNovDec"
 
    For i = 1 To 36 Step 3
        t = Replace(t, Mid(m, i, 3), 1 + i \ 3)
        If IsDate(t) Then convEngToDate = CDate(t): Exit For
    Next
End Function
 
Private Function convEngToDate2(t$) As Date
    Dim m$, i%
    m = "JanFebMarAprMayJunJulAugSepOctNovDec"
 
    For i = 1 To 36 Step 3
        t = Replace(t, Mid(m, i, 3), 1 + i \ 3)
    Next
    convEngToDate2 = CDate(t)
End Function
 
Private Function convEngToDate3(t$) As Date
    Dim tmp$, i%: Const m = "JanFebMarAprMayJunJulAugSepOctNovDec"
 
    For i = 0 To 11
        tmp = Mid(m, 1 + i * 3, 3)
        If InStr(t, tmp) Then
           convEngToDate3 = CDate(Replace(t, tmp, i + 1))
           Exit Function
        End If
    Next
End Function
0
34 / 31 / 1
Регистрация: 06.01.2017
Сообщений: 300
03.06.2017, 13:42
Ну как же не наблюдаете-то?
Вот же у Вас в ячейках B1/B2 появились новые значения, т.е. старые значения там стёрлись.

Добавлено через 5 минут
Соглашусь, что Ваш код конвертации очень красив и компактен.
1
 Аватар для pashulka
4139 / 2243 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
03.06.2017, 14:20
Для меня искажение, это если после конвертации "10 Jan 2004" я получу 25.5.2004
а замена "01 Jan 2007" на 01.01.2017 как раз и входила в мои планы.
0
34 / 31 / 1
Регистрация: 06.01.2017
Сообщений: 300
03.06.2017, 15:11
Это не искажение, а ошибка.
Ошибки у Вас нет, а вот искажение есть — на листе были одни данные, сталичто другие.
0
 Аватар для pashulka
4139 / 2243 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
03.06.2017, 15:19
Столбец A исходные данные (формат ячейки Текстовый/Общий) B конечные (формат ячейки ДД.ММ.ГГГГ)

Можете сказать в каких ячейках, после конвертации, дата исказилась ?
0
34 / 31 / 1
Регистрация: 06.01.2017
Сообщений: 300
03.06.2017, 16:33
В ячейках столбца B были данные.
После операции они исчезают.
0
 Аватар для pashulka
4139 / 2243 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
03.06.2017, 18:20
До конвертации(замены) в ячейках столбца B был тот же текст, что и в ячейках столбца A.

При любом раскладе, Вам просто необходимо, посмотреть значение слова искажение
0
34 / 31 / 1
Регистрация: 06.01.2017
Сообщений: 300
03.06.2017, 22:06
Вот это подойдёт?
Слово Искажение в словаре Синонимов
искривление, порча, стирание ...
На листе были одни данные, после выплнения программного кода стали другие, что и означает искривление, порча, стирание ...
Вы же и сами пишете:
До конвертации(замены) в ячейках столбца B был тот же текст, что и в ячейках столбца A.
Т.е. в этих ячейках были какие-то данные. После конвертации в этих ячейках другие данные.
Грубо говоря, было Георгий, стало Егор.
==============================
Да Вы вспомните, что было сказано изначально:
Вариант 2а искажает исходные данные.
0
 Аватар для pashulka
4139 / 2243 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
03.06.2017, 22:55
Синонимы искажения - меня не интересуют.

Но становится понятно, что Вам настолько дорог мусор, типа "01 Jan 17", что замена его на дату 01/01/2017 в этой же ячейке, для Вас - это искажение.


Однако, если внимательно посмотреть на мой скриншот, то можно увидеть, что все исходные данные остались неизменными (см.первый столбец) Более того, перед выполнением макроса, все ячейки второго столбца были пустые, ибо метод Copy никто не отменял.
0
34 / 31 / 1
Регистрация: 06.01.2017
Сообщений: 300
03.06.2017, 23:16
Ну вот Вы сами всё и сказали — ячейки столбца были пустыми, а после выполнения программного кода в них появилось некое содержание. Как итог, данные на листе оказались изменены.

Скажите, о чем Вы спорите?
Может быть Вы просто не поняли сказанного?
Ну так я повторю — выполнение операции Replace искажает исходные данные.
Задача состоит в обработке исходных данных, которые я не хочу искажать. Результаты обработки исходных данных будут записаны на других листах, а листы с исходными данными я желаю сохранить в первоначальном = неискаженном виде.
0
 Аватар для pashulka
4139 / 2243 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
03.06.2017, 23:20
Я сказал, что для удобства и уменьшения количества скриншотов, вывел новые данные на этот же лист, но я могу проделать тоже самое и с другим рабочим листом. Правда в обоих случаях - исходные данные останутся неизменными(неискаженными)
0
34 / 31 / 1
Регистрация: 06.01.2017
Сообщений: 300
06.06.2017, 16:50
Кстати, кажется мне удалось оптимизировать даже Ваш компактный кодз!
Смотрите:
Visual Basic
1
2
3
Function AyNum(Ay As String) As Integer
 AyNum = (InStr(1, "JanFebMarAprMayJunJulAugSepOctNovDec", Ay) + 2) \ 3
End Function
Константа вставлена внутрь функции InStr единственно с целью показать, что и так можно.

Добавлено через 15 секунд
Кстати, кажется мне удалось оптимизировать даже Ваш компактный кодз!
Смотрите:
Visual Basic
1
2
3
Function AyNum(Ay As String) As Integer
 AyNum = (InStr(1, "JanFebMarAprMayJunJulAugSepOctNovDec", Ay) + 2) \ 3
End Function
Константа вставлена внутрь функции InStr единственно с целью показать, что и так можно.
0
 Аватар для pashulka
4139 / 2243 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
06.06.2017, 17:51
А я вспомнил, что в Excel можно ещё проще :

Visual Basic
1
2
3
4
5
6
7
Function locDate(engDate$) As Date
    locDate = Evaluate("DateValue(""" & engDate & """)")
End Function
 
Private Sub Test()
    MsgBox locDate("6 Jul 17")
End Sub
1
193 / 191 / 31
Регистрация: 11.10.2016
Сообщений: 610
06.06.2017, 17:54
Цитата Сообщение от MU-GK Посмотреть сообщение
Делаю это тупым выделением дня, месяца, года и заменой имени месяца его номера простым перебором типа:
проще сделать вот так:
Visual Basic
1
2
i = InStr("JanFebMarAprMayJunJulAugSepOctNovDec", ms)
if i > 0 then MonthNum = (i + 2) / 3
блин, тут оказывается на второй странице уже нечто похожее придумали (:
1
 Аватар для pashulka
4139 / 2243 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
06.06.2017, 18:01
MU-GK, Вы привели только часть кода, а разделение строки на день, месяц и год осталось, что называется, за бортом. Я же предлагал вообще отказаться от разделения и просто конвертировать текст в дату.
0
06.06.2017, 18:12

Не по теме:

Ребята, шли бы вы отсюда :D Устроили тут обсуждение в чужой теме. Все, начиная с 11-го поста - оффтоп.

0
 Аватар для Sasha_Smirnov
5562 / 1370 / 150
Регистрация: 08.02.2009
Сообщений: 4,109
Записей в блоге: 30
06.06.2017, 20:54
Цитата Сообщение от Hugo121 Посмотреть сообщение
Не в английском Экселе...
но можно родительный падеж любого месяца извлечь из самого VBA:
Цитата Сообщение от Gibboustooth Посмотреть сообщение
Формат для 2007 экселя
Применительно к исходному коду можно просто строку
Цитата Сообщение от MIRsky Посмотреть сообщение
Visual Basic
1
ActiveCell.FormulaR1C1 = x
заменить на
Visual Basic
1
ActiveCell.FormulaR1C1 = mid(Format(Date, "dd MMMM"), 4)
Всё!
2
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
06.06.2017, 21:36
Цитата Сообщение от Sasha_Smirnov Посмотреть сообщение
Всё!
Это не наш метод (с) Мы не ищем лёгких путей.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.06.2017, 21:36

Определите даты определенного дня недели заданного месяца и года
Определите даты определенного дня недели заданного месяца и года.

Формирование двумерных массивов VBA
Сформировать матрицы произвольной размерности на рабочем листе Excel

Если даты являются датами одного месяца, то добавить строчку ниже
Здравствуйте, есть таблица, первый столбец - даты. Как добавить строчку ниже дат одного и того же месяца(и года) ниже? есть: 01.02.16...

Даты в VBA
Microsoft Word Ввести с клавиатуры дату. Ввести цифру(от 0 до 9). Определить содержит ли дата заданную цифру.

Даты в VBA
как сделать, тк чтобы он не выдавал данные с минусом? a = DateDiff("d", "20.05.2016", Now) MsgBox "С 10.06.2016 осталось дней до...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru