Существует три варианта:
- Разделить строку перед сохранением в словаре
- Редактировать содержимое словаря
- Разделить строки по мере их извлеченияиз словаря
Для большей части кода я бы полагал, что использование варианта 1) будет наиболее целесообразным.Главным образом потому, что словари могут использоваться несколько раз.Кроме того, этот метод учитывает, работает ли строка, которую вы хотите отредактировать, как ключ.
В зависимости от структуры словаря вариант 2) может быть самым простым или самым сложным.(С вашими вложенными словарями - и, возможно, другими правилами, для которых слово нужно сохранить - это, вероятно, будет более сложным).Однако, если вы хотите использовать этот метод, имейте в виду, что вам придется перезаписать старый элемент новым (и если вы изменяете значения ключей, вы будете только добавлять ключи, а не перезаписывать их)
Если вы извлекаете значения из словаря только один раз, возможно, проще всего отредактировать строку непосредственно перед ее использованием там, где это необходимо.
Полагаю, для вашего кода вы можете пожелатьвыполнить редактирование перед сохранением значений в словаре.
Что, я полагаю, будет в основном в этом разделе вашего кода:
For i = 1 To finalrow1
'Basic info in column A
SearchString = datasheet.Range("A" & i)
If InStr(1, SearchString, "Change number") Then
chNum = datasheet.Cells(i, 1)
ChangeNumbers.Add chNum, New Dictionary 'For ticket numbers
ElseIf InStr(1, SearchString, "Change subject") Then
chSub = datasheet.Cells(i, 1)
ChangeNumbers.Item(chNum).Add chSub, New Dictionary 'For change subjects
ElseIf InStr(1, SearchString, "Report-") Then
rptNum = datasheet.Cells(i, 1)
ChangeNumbers.Item(chNum).Item(chSub).Add rptNum, New Dictionary 'For analysis
'Loop for the details (requirements, tech.specs, impl. and testing)
j = 0
'Verifies that the details belong to the current report
'String checks are included after locating a report to maintain a connection between the report and its details
Do While IsEmpty(datasheet.Cells(i + j, 1)) Or datasheet.Cells(i + j, 1) = rptNum
If InStr(1, datasheet.Cells(i + j, 2), "Priority") Then
' The 4 after ".Add" is the column number for this detail in sheet2
ChangeNumbers.Item(chNum).Item(chSub).Item(rptNum).Add 4, datasheet.Cells(i + j, 2) ' the detail #1
ElseIf InStr(1, datasheet.Cells(i + j, 2), "Workload") Then
' The 5 after ".Add" is the column number for this detail in sheet2
ChangeNumbers.Item(chNum).Item(chSub).Item(rptNum).Add 5, datasheet.Cells(i + j, 2) ' the detail #2
ElseIf InStr(1, datasheet.Cells(i + j, 2), "Deadline") Then
' The 6 after ".Add" is the column number for this detail in sheet2
ChangeNumbers.Item(chNum).Item(chSub).Item(rptNum).Add 6, datasheet.Cells(i + j, 2) ' the detail #3
End If
j = j + 1
Loop
End If
Next i
Разделение-линейный пример, который вы предоставили:
Split(Sheets("reportsheet").Range("A1").Value, " ")(wordNumber - 1)
имеет переменную wordNumber
, которую я не вижу нигде в вашем существующем коде;поэтому я предполагаю, что это псевдо-переменная (пока что заполнитель).
Возможно, я бы попытался добавить расщепление следующим образом:
Вместо
chNum = datasheet.Cells(i, 1)
добавьте разделение, чтобы сделать его
chNum = Split(datasheet.Cells(i, 1)," ")(wordNumber - 1)
Вместо
ChangeNumbers.Item(chNum).Item(chSub).Item(rptNum).Add 4, datasheet.Cells(i + j, 2) ' the detail #1
добавьте разделение, чтобы сделать его
ChangeNumbers.Item(chNum).Item(chSub).Item(rptNum).Add 4, Split(datasheet.Cells(i + j, 2)," ")(wordNumber - 1) ' the detail #1
И так далее, черездругие применимые разделы кода.
Обратите внимание на первый пример выше, если вы добавили разделение здесь:
ChangeNumbers.Add chNum, New Dictionary 'For ticket numbers
->
ChangeNumbers.Add Split(chNum," ")(wordNumber - 1), New Dictionary 'For ticket numbers
Я полагаю, что вы будете вызывать ошибки, так как строка, такая как:
ChangeNumbers.Item(chNum).Item(chSub).Item(rptNum).Add 4, datasheet.Cells(i + j, 2) ' the detail #1
больше не будет ссылаться на действительный ключ в словаре ChangeNumbers
(chNum
больше не будет соответствовать ключу, назначенному здесь, ChangeNumbers.Add Split(chNum," ")(wordNumber - 1), New Dictionary 'For ticket numbers
(ключ -> Split(chNum," ")(wordNumber - 1)
)