У меня есть диапазон столбцов около 500 строк. Большинство этих ячеек хранятся в виде текста. Я заполняю список в пользовательской форме со значениями из этого диапазона. Когда пользователь выбирает одно из этих значений из списка, событие найдет значение в той же строке из другого столбца, используя «Индекс» и «Совпадение», и покажет его в метке на пользовательской форме. Я получаю сообщение об ошибке при выборе одной из нескольких ячеек в списке, которые не хранятся в виде текста в диапазоне, потому что есть ведущее пространство. Я предполагаю, что заполненный список автоматически удаляет ведущие пробелы из любых ячеек в диапазоне. Поэтому, когда он пытается найти значение 12345 из списка, например, в диапазоне он не может найти его, потому что диапазон содержит (пробел) 12345. Я пробовал:Удалить ведущее пространство из диапазона
Public Sub UserForm_Initialize()
Dim arr() As Variant
Dim rNum As Range
Const sNum As String = "Number"
Me.EnableEvents = False
wsName = "Report"
Set curWb = ActiveWorkbook
Set pReport = curWb.Worksheets(wsName)
Set pTable = pReport.ListObjects("tableName")
With pReport
If .AutoFilterMode = True Then .ShowAllData
.Cells.Rows.Hidden = False
.Cells.Columns.Hidden = False
End With
Set wf = Application.WorksheetFunction
With pTable
Set rNum = .ListColumns(.ListColumns(sNum).Range.column).DataBodyRange
End With
-- HERE is where I tried all my implementations without success
arr = wf.Transpose(pReport.Range(rNum.address).Value)
Call BubbleSort(arr)
frmIssues.lstIssues1.List = arr
lstIssues1.ListStyle = 1
lstIssues2.ListStyle = 1
lstIssues1.MultiSelect = 2
lstIssues2.MultiSelect = 2
txtFocus.SetFocus
Me.EnableEvents = True
End Sub
Private Sub lstIssues1_Change()
Dim rNum As Range
Dim rTitle As Range
Dim strResult As String
Dim intIndex As Integer
Dim intCount As Integer
Const sNum As String = "Number"
Const sTitle As String = "Title"
If EnableEvents = False Then Exit Sub
With lstIssues1
For intIndex = 0 To .ListCount - 1
If .Selected(intIndex) Then intCount = intCount + 1
Next
End With
If intCount = 1 Then
Set wf = Application.WorksheetFunction
wsName = "Report"
Set curWb = ActiveWorkbook
Set pReport = curWb.Worksheets(wsName)
Set pTable = pReport.ListObjects("tableName")
With pTable
Set rNum = .ListColumns(.ListColumns(sNum).Range.column).DataBodyRange
Set rTitle = .ListColumns(.ListColumns(sTitle).Range.column).DataBodyRange
End With
With pReport
strResult = wf.Index(.Range(rTitle.address), wf.Match(lstIssues1.List(lstIssues1.ListIndex), .Range(rNum.address), 0))
End With
lblDescription.Caption = wf.Trim(strResult)
txtFocus.SetFocus
Else
lblDescription.Caption = ""
txtFocus.SetFocus
Exit Sub
End If
Me.EnableEvents = False
For i = 0 To lstIssues2.ListCount - 1
If lstIssues2.Selected(i) = True Then lstIssues2.Selected(i) = False
Next
Me.EnableEvents = True
End Sub
и многочисленные вариации этого (Clean, ПРМ, .text и т.д.) и ничего не работает. Воистину, я понятия не имею, как это исправить, и любая помощь, которую очень ценит. Спасибо!
Разъяснение
1) Этот файл Excel генерируется из Интернета.
2) Макро превращает рабочий лист в таблицу
3) Left(Range("D362"),1)
возвращает 1
(число, скажем, 12345)
4) Перед тем как ошибка происходит Range("D362")
возвращается (space)12345
5) После возникновения ошибки Range("D362")
возвращает (space)12345
Если клетки в столбце содержат ** цифры ** только **? ? ** –
@ Gary'sStudent Нет, около 20 строк или около того, которые начинаются с буквы. Большинство ячеек, включая текстовые, работают. Только те, которые не сохранены в виде текста, этого не делают. – Brian
В зависимости от типа переменной «item» я подозреваю, что ваши функции TRIM()/REPLACE() не работают. Если элемент - это диапазон (одна ячейка), который кажется вероятным из диапазона (item.address), вам нужно работать с item.Value –