【问题标题】:Remove a leading space from a range从范围中删除前导空格
【发布时间】: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 itemVariant。我也曾与.Value 合作过,但这不起作用。谢谢你的建议。
  • 您是否尝试过对其他未被 TRIM() 删除的字符使用替换,例如 Char(160) [不间断空格]?

标签: excel excel-2013 vba


【解决方案1】:

我刚刚对此进行了测试,它可以删除字符串开头的空格。可悲的是,这不是我(可能是你)更喜欢的单行

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

如果您需要任何确认,请告诉我

【讨论】:

  • 感谢您的帖子,但它不起作用。即使在尝试在范围内找到它时出现,它也无法识别空格。我在 SO 中读到一些关于 Excel 在从文本转换时为 # 保留空间但我找不到它的内容。
  • 当我在 Excel 2010 上试用它时,它工作得非常好,您使用的是 excel 2013,所以代码不应该有问题。如果你这样做CellValue = ActiveCell.Value,它会在字符串的开头显示一个空格吗?
  • ActiveCell.Value 在字符串的开头不显示空格。我在顶部的澄清更新中指出了这一点。我最近还添加了更多代码,以帮助那些试图提供帮助的人获得更多洞察力。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-25
  • 1970-01-01
  • 2020-08-20
  • 1970-01-01
  • 2017-04-05
  • 2018-06-07
相关资源
最近更新 更多