В моем регионе дата вставляется как дд/мм/гггг или вариации этого (включая дд-мм-гг). Я создал форму Excel (в обычном файле Excel), уже отформатированную для отображения даты как дд/мм/гггг, но когда я набираю "05/04/2015", она отображается как "04/05/2015". Я знаю, что это можно решить, изменив региональные настройки на мои местные, но мне нужно распространить эту форму среди множества людей, которые не знают, как менять региональные настройки, и предполагая, что никто не может научить, как это сделать, поэтому мой вопрос:
Есть ли способ ввести «05/04/2015» и быть распознанным как «5 апреля 2015 г.», не меняя региональные настройки?
Дополнительное примечание: когда я имею в виду «4 мая 15» (введено как 4/5/15), Excel распознает это как «5 апреля 15», поскольку Excel принимает ввод в формате «мм/дд/гг». Мне нужно изменить поведение Excel по умолчанию, чтобы оно принимало вид «дд/мм/гггг»поскольку именно таким образом пользователи будут вводить данные.
Если возможно, настройку следует также включить/внедрить в файл, чтобы конечные пользователи могли использовать форму, даже не меняя настройки.
Я не знаком с макросами и VBA, но готов попробовать :)
EDIT: это связано с моим вопросом: Как изменить формат даты с дд-мм-гггг на дд-мм-гг в строке формул MS-EXCEL?
но мне не нужно менять всю строку формул, пока Excel распознает, что я ввожу данные в формате дд/мм/гг.
решение1
Событие Worksheet_Change
может по сути выполнить то, что вы просите, но вы должны быть уверены, что пользователь намерен что-то изменить. Я добавил поле 'Yes/No'
выбора в свое решение, чтобы предотвратить любые случайные изменения. Делать это без поля выбора рискованно, потому что если вы попытаетесь изменить существующее значение, оно вернется к исходному форматированию.
Этот код должен «жить» внутри кода VBA для листа, на котором вы хотите, чтобы он действовал:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim iDay, iMonth, iYear As Integer
Dim solutionRange As Range
'the cells you want the date to change for
Set solutionRange = Range("D4:D12")
'only triggers if the user's changing one cell
If Target.Count = 1 Then
If (Not (Intersect(solutionRange, Target) Is Nothing) And (Target.Value > 0)) Then
'disable application events so this change doesn't trigger itself
Application.EnableEvents = False
iDay = Left(Target.Value, 2)
iMonth = Mid(Target.Value, 4, 2)
iYear = Right(Target.Value, 4)
' Give the user a choice to say whether they need the date changed. You *can* remove both the 'If' and 'End If' if you really need to, but I'd strongly suggest keeping them.
If (MsgBox("Have you entered your date in the format 'MM/DD/YYYY'?", vbYesNo) = vbYes) Then
Target.Value = DateValue(iMonth & "/" & iDay & "/" & iYear)
End If
Application.EnableEvents = True
End If
End If
End Sub
решение2
Я точно знаю, о чем вы говорите. Мне нравится вводить ГГ-ММ-ДД. Параметра, чтобы изменить его на тот, который вам нужен, нет в Excel. Параметр, который вам нужен, есть в Windows. Он спрятан где-то в панели управления "время и язык".
Мне пришлось зайти в расширенные настройки «Изменить формат времени и даты» и изменить настройку «Краткая дата».
В зависимости от используемой операционной системы инструкции могут немного отличаться.
Надеюсь это поможет.
решение3
Я не думаю, что можно изменить значение по умолчанию. Это особенно неудобно исправлять, когда импортируешь данные из-за рубежа.
Самый простой способ сделать это, который я могу придумать, — это сделать это вручную...
Вариант 1: Мы могли бы принять входные данные втекстотформатировать и поместить их в ячейки, таким образом Excel не будет пытаться интерпретировать их как даты. Затем, в соседней ячейке мы могли бы использовать функцию ДАТА вместе с LEFT, RIGHT и MID. Например (указать, что пользователь должен ввести дату полностью в формате MM/DD/YYYY):
Ячейка A1: 04/05/2015
Ячейка B1: =ДАТА(ПРАВСИМВ(A1,4), ЛЕВСИМВ(A1,2), СРЕДИНИЦА(A1,4,2) )
Вариант 2: Попросите пользователя ввести «день», «месяц» и «год» в три отдельные ячейки или поля, что может быть лучше или хуже в зависимости от ваших настроек.
В любом случае, удачи!
решение4
У меня возникла та же проблема при назначении нового значения данных в ячейку, используя тот же формат, который у нее уже был.
12-02-2018 будет заменено на 2 дек 2018, хотя формат целевой ячейки был таким же.
Использование ..Range("B10").Value = DateValue(newdate) решило мою проблему