2016-06-03 5 views
0

У меня есть диапазон столбцов около 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

+0

Если клетки в столбце содержат ** цифры ** только **? ? ** –

+0

@ Gary'sStudent Нет, около 20 строк или около того, которые начинаются с буквы. Большинство ячеек, включая текстовые, работают. Только те, которые не сохранены в виде текста, этого не делают. – Brian

+0

В зависимости от типа переменной «item» я подозреваю, что ваши функции TRIM()/REPLACE() не работают. Если элемент - это диапазон (одна ячейка), который кажется вероятным из диапазона (item.address), вам нужно работать с item.Value –

ответ

0

Я только что протестировал это, и он работает при удалении пространства на th начало строки. К сожалению, оно не одну строку, как я (и, вероятно, вы) предпочли бы

Sub test() 

Dim CellValue As String 
Dim lngNumberOfCharacters As Long 

CellValue = ActiveCell.Value 
CellValueCheck = Left(CellValue, 1) 

If CellValueCheck = " " Then 
lngNumberOfCharacters = Len(CellValue) - 1 

CellValue = Right(CellValue, lngNumberOfCharacters) 
ActiveCell.Value = CellValue 
End If 

End Sub 

Позвольте мне знать, если вам нужно что-нибудь подтвердил

+0

Спасибо за сообщение, но он не работает. Он не распознает пространство, даже если оно появляется при попытке найти его в диапазоне. Я прочитал что-то в SO о том, что Excel резервирует пространство для '#' при преобразовании из текста, но я не могу его найти. – Brian

+0

Когда я пробовал его в Excel 2010, он работал отлично, вы используете excel 2013, поэтому не должно быть проблем с кодом. Если вы делаете «CellValue = ActiveCell.Value', то оно показывает пробел в начале строки? –

+0

'ActiveCell.Value' не показывает пробел в начале строки. Я указал, что в моем обновлении Clarification вверху. Я также недавно добавил больше кода, чтобы помочь дать больше информации тем, кто пытается помочь. :-) – Brian