У меня есть ячейка, которая содержит разделенный запятыми список пар Part * Number.
Действительные пары
- Часть * Количество
- Количество * Часть
- Часть
Часть является строкой или указанным числом, а количество является числом
Пример действительного значения ячейки
Part1,Part2*2,3*Part3,"12332","2123"*3
Пример неверного значения ячейки
Part1**5,12332*3,Part2*Part2
Цель
Значение ячейки вводится пользователем вручную, и мне нужно проверить, что каждый элемент в списке действителен, когда пользователь запускает макрос проверки.
Пока я делаю это, я также помещаю элементы в один и тот же формат и объединяю любые повторяющиеся записи.
Недопустимые записи перемещаются в начало списка.
Сейчас я пытаюсь выделить недопустимые записи, установив красный цвет шрифта и выделив его жирным шрифтом (только для каждого недопустимого элемента).
Я сделал (код не впечатляющий ...) большую часть, но выделение просто не сработает. Я возился с этим некоторое время, но не могу заставить его работать. http://pastebin.com/CSrU66iz
Public Sub validateList(ByVal ListRange As Range)
Dim List As Dictionary
Dim Problem As Dictionary
Dim Items() As String
Dim Pairs() As String
Dim Item As Variant
Dim Pair As Variant
Dim Output As String
Dim Position As Integer
Set List = New Dictionary
Set Problem = New Dictionary
Items = Split(ListRange.Value, Main.LST_SEPERATOR)
Invalid = ""
For Each Item In Items
Item = Trim(Item)
Pairs = Split(Item, Main.QTY_SEPERATOR)
For Each Pair In Pairs
Pair = Trim(Pair)
Next Pair
Select Case UBound(Pairs)
Case 1
' Part and Quantity
If CStr(Main.parseInteger(Pairs(0))) = Pairs(0) Then
' Pairs(0) Probably Quantity
If CStr(Main.parseInteger(Pairs(1))) = Pairs(1) Then
' Problem! Both Pairs(0) and Pairs(1) are Numbers
Problem.Add Pairs(0) & Main.QTY_SEPERATOR & Pairs(1), 0
Else
' Pairs(0) = Quantity, Pairs(1) = Part
If List.Exists(Pairs(1)) = False Then
List.Add Pairs(1), Main.parseInteger(Pairs(0))
Else
List(Pairs(1)) = List(Pairs(1)) + Main.parseInteger(Pairs(0))
End If
End If
Else
' Pairs(0) Probably Part
If CStr(Main.parseInteger(Pairs(1))) = Pairs(1) Then
' Pairs(0) = Part, Pairs(1) = Quantity
If List.Exists(Pairs(0)) = False Then
List.Add Pairs(0), Main.parseInteger(Pairs(1))
Else
List(Pairs(0)) = List(Pairs(0)) + Main.parseInteger(Pairs(1))
End If
Else
' Problem! Both Pairs(0) and Pairs(1) are Strings
Problem.Add Pairs(0) & Main.QTY_SEPERATOR & Pairs(1), 0
End If
End If
Case 0
' Part Only
If List.Exists(Pairs(0)) = False Then
List.Add Pairs(0), 1
Else
List(Pairs(0)) = List(Pairs(0)) + 1
End If
Case Else
Problem.Add Item, 0
End Select
Next Item
Position = 1
ListRange.Value = ""
For Each Item In Problem.Keys
If Not ListRange.Value = "" Then
ListRange.Value = ListRange.Value & ", "
Debug.Print Position
With ListRange.Characters(Start:=Position, Length:=2)
.Font.Color = RGB(0, 0, 0)
.Font.Bold = False
End With
Position = Position + 2
End If
Output = Item
ListRange.Value = ListRange.Value & Output
With ListRange.Characters(Start:=Position, Length:=Len(Item))
.Font.Color = RGB(255, 0, 0)
.Font.Bold = True
End With
Position = Position + Len(Item)
Next Item
For Each Item In List.Keys
If Not ListRange.Value = "" Then
ListRange.Value = ListRange.Value & ", "
With ListRange.Characters(Start:=Position, Length:=2)
.Font.Color = RGB(0, 0, 0)
.Font.Bold = False
End With
Position = Position + 2
End If
If List(Item) = 1 Then
Output = Item
Else
Output = Item & Main.QTY_SEPERATOR & List(Item)
End If
ListRange.Value = ListRange.Value & Output
With ListRange.Characters(Start:=Position, Length:=Len(Output))
.Font.Color = RGB(0, 0, 0)
.Font.Bold = False
End With
Position = Position + Len(Item)
Next Item
End Sub
Примечание
- Для работы словаря вам потребуется ссылка на «Microsoft Scripting Runtime».
- Main.parseInteger () немного похож на CInt ()
- Main.LST_SEPERATOR является константой с "," в
- Main.QTY_SEPERATOR является константой с "*" в
- Я не так хорош, чтобы задавать вопросы