【发布时间】:2016-06-04 01:22:57
【问题描述】:
我的列范围约为 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、CStr、.Text 等),但没有任何效果。真的,我不知道如何解决这个问题,非常感谢任何帮助。谢谢!
澄清
1) 此 Excel 文件是从 Web 生成的。
2) 宏将工作表变成表格
3) Left(Range("D362"),1) 返回 1(例如,数字是 12345)
4) 错误发生前Range("D362") 返回(space)12345
5) 错误发生后Range("D362")返回(space)12345
【问题讨论】:
-
列中的单元格是否应该只包含数字 ??
-
@Gary'sStudent 不,大约有 20 行左右以字母开头。大多数单元格,包括文本单元格,都可以工作。只有那些不存储为文本的不会。
-
根据“项目”的变量类型,我怀疑您的 TRIM()/REPLACE() 函数不起作用。如果 item 是一个范围(单个单元格),看起来可能来自 Range(item.address),您需要处理 item.Value
-
@PaaquaGrant
item是Variant。我也曾与.Value合作过,但这不起作用。谢谢你的建议。 -
您是否尝试过对其他未被 TRIM() 删除的字符使用替换,例如 Char(160) [不间断空格]?
标签: excel excel-2013 vba