У меня есть ячейка, которая содержит список пар частей * Партии с запятыми.Применение форматирования текста к строкам внутри ячейки
Правильные пар
- часть * Количество
- Количество * Часть
- Часть
часть является строка или цитируемый номер, и количество это номер
Пример Valid Cell Value
Part1,Part2*2,3*Part3,"12332","2123"*3
Пример Недопустимый Cell Value
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 константа с "*" в
- Я не все, что хорошо задавать вопросы
+1 за хорошо объяснил вопрос :) –
мне удалось решить эту проблему, но я не позволил ответить на это сам: D Будет ли добавить его на вопрос. – NickSlash
Думаю, вы можете опубликовать свой ответ ниже и принять его :) –