Есть идеи, почему VBA не учитывает регистр в VLookup? - PullRequest
0 голосов
/ 30 мая 2019

Я создал макрос VBA, чтобы просмотреть строку входного текста в ячейке E3, разделить ее на отдельные символы, а затем VLookup эти символы по таблице ширины пикселей отдельных символов, которая добавляется в код с помощью именованный диапазон, "pw_Table".

Ширина пикселей для каждой буквы затем суммируется и отображается в ячейке под полем ввода текста - «Ячейки (4,5)». Нажатие на return должно показывать суммарную ширину в пикселях для всей строки.

Проблема в том, что он не учитывает регистр и использует одно и то же значение VLookup для символов верхнего и нижнего регистра.

Все руководства, которые я видел, говорят, что VBA чувствителен к регистру VLookup, и все, что я могу найти, - это способы обойти это.

В моем случае, однако, VLookup должен быть чувствительным к регистру, чтобы убедиться, что я получаю правильную ширину пикселя для каждой буквы, например, "c" имеет ширину 9 пикселей, "C" равно 13.

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

Я думал, что могу использовать INDEX, MATCH и EXACT, но не мог понять, как реализовать это в VBA.

Это код макроса ...

Private Sub ReadCharacter()    
    cell_value = ThisWorkbook.Sheets("Pixel-widths").Range("E3")    
    Character_Value = 0    
    For rep = 1 To Len(cell_value)
        Character = Mid(cell_value, rep, 1)        
        On Error GoTo MyErrorHandler        
        Character_Value = Application.WorksheetFunction.VLookup(Character, [pw_Table], 2, 0)          
        Pixel_Width = Pixel_Width + Character_Value        
MyErrorHandler:
        Character_Value = 10
        Resume Next        
    Next rep        
        Cells(4, 5) = Pixel_Width    
End Sub

У меня были некоторые проблемы с числами, когда VBA сообщал об ошибке времени выполнения 1004, но я решил эту проблему, добавив ловушку для ошибок, поскольку все цифры от 0 до 9 имеют ширину 10 пикселей.

Я просто не понимаю, почему VBA нарушает свои собственные правила.

Ответы [ 2 ]

1 голос
/ 30 мая 2019

Vlookup не чувствителен к регистру.

Я обнаружил, что эта функция «имитирует» регистр, чувствительный к vlookup.

Function CaseVLook(FindValue, TableArray As Range, Optional ColumnID As Integer = 1) As Variant
    Dim xCell As Range
    Application.Volatile
    CaseVLook = "Not Found"
    For Each xCell In TableArray.Columns(1).Cells
        If xCell = FindValue Then
            CaseVLook = xCell.Offset(0, ColumnID - 1)
            Exit For
        End If
    Next
End Function

чтобы использовать его, просто назовите его CaseVLook (F1, A1: C7,3)

Больше информации здесь

https://www.extendoffice.com/documents/excel/3449-excel-vlookup-case-sensitive-insensitive.html

удачи

0 голосов
/ 30 мая 2019

Вот еще один способ ...

Character_Value = Evaluate("INDEX(" & Range("pw_Table").Address(, , , True) & _
    ",MATCH(TRUE,EXACT(INDEX(" & Range("pw_Table").Address(, , , True) & ",0,1),""" & Character & """),0),2)")

Надеюсь, это поможет!

...