Я хочу сделать некоторые проверки данных в моей книге Excel. Я хочу использовать как можно больше централизованных значений для проверки данных, так как одни и те же значения используются для нескольких листов. Теперь я добавил некоторые проверки для кодов валют (USD ...). проверка основана на списке на другом листе, и его работа вроде хорошая. Моя проблема в том, что я все еще могу вводить строчные значения, а не только точные значения. Я бы предпочел решение, которое не использует VBA возможно. Если это возможно только с VBA, пожалуйста, добавьте некоторую информацию о том, как добавить его в рабочую книгу и тому подобное.

Значения, которые я хочу разрешить:

CHF
EUR
GBP
USD
DKK
SEK
NOK

и проверка данных выглядит следующим образом: =Sheet1!$S$2:$S$8 но также допускает значения выше в нижнем регистре, что не то, что я хочу (я вижу, что я могу перечислить значения в проверке данных, и тогда он принимает только точные совпадения, но ради отсутствия много работы, если значения меняются, я хочу, чтобы они были централизованы).

Я думаю, что было бы также достаточно преобразовать значения в верхний регистр, но это должно происходить в той же ячейке, например. Я ввожу eur в ячейку J6 тогда она должна преобразовать значение в верхний регистр и записать его также в J6

2 ответа2

1

Если ячейка, которую вы хотите проверить, находится в ячейке A1, установите для параметра Тип проверки данных значение Пользовательский вместо Списка и вставьте эту формулу в:

=AND(SUMPRODUCT(--((CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>64)),--(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<91))=LEN(A1),--(IFERROR(IF(MATCH(A1,Sheet1!$S$2:$S$8,0),1),0)))

Прохождение

Эта формула использует два условия в сочетании с AND() - во-первых, проверка того, является ли значение верхним регистром, во-вторых, проверка того, что значение соответствует вашему списку разрешенных опций.

 =AND(
    SUMPRODUCT(
       --(
           (CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>64)
         )
       ,--(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<91)
     )=LEN(A1)
   ,--(IFERROR(IF(MATCH(A1,Sheet1!$S$2:$S$8,0),1),0)))

Биты, которые выглядят как CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>64 , проверяют код ASCII для каждого отдельного символа. Если они между кодами ASCII 64 и 91, мы знаем, что они прописные. Если количество символов в верхнем регистре соответствует длине строки значения, мы знаем, что все они в верхнем регистре.

Часть MATCH() проверяет, отображается ли значение в вашем списке валют.

Примечание: кричите на этот пост для проверки заглавных букв.

1

Я нашел решение с VBA:
Сделайте правый клик на вкладке вашего рабочего листа и выберите «Показать код ...». В VBA-редакторе введите эти макросы:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("A1:C100")) Is Nothing Then
         On Error GoTo ErrorHandler
         Application.EnableEvents = False
         Target.Value = UCase(Target)
    ErrorHandler:
        Application.EnableEvents = True
    End If
End Sub

Измените диапазон, соответствующий вашим потребностям. Вы должны сохранить свой файл как *.xlsm . Затем каждый текст в диапазоне преобразуется в верхний регистр.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .