【问题标题】:Cut string from the first number from the left using Excel VBA使用Excel VBA从左边的第一个数字中剪切字符串
【发布时间】:2020-11-06 05:02:00
【问题描述】:

我需要获取宏范围的列字母。我特别需要列字母,直接使用 VBA Address 函数获得的列数字将不起作用。由于范围始终仅来自一列,因此简化了任务。检索到的范围可能类似于 B3B3:B5,但始终是同一列并且位于表内。

所以,我需要(在这种情况下)得到 B 作为字符串。我尝试执行以下操作:

RangeOfInterest = Worksheets("Sheet1").Range("Table1[Column1]").Address(0, 0)
RangeColumn = Right(RangeOfInterest, Len(RangeOfInterest) - InStr(RangeOfInterest, [0-9]))

但是,我遇到了一系列问题。首先,有InStr 函数。我认为这是最好的方法,因为这个函数从左边开始搜索字符的位置,这正是我所需要的。但是,我需要它来搜索许多值(从 0 到 9 的任何数字)。我可以将所有数字添加为搜索参数还是使用某种技巧在一系列数字之间进行搜索?我试过的肯定不行。

另一方面,我假设如果我设法将所有从 0 到 9 的数字相加,该函数将开始逐个搜索它们,而不是在字符串中第一次出现任何数字时停止?这将导致问题,例如,如果有一个像 B3:B10 这样的范围,它将开始搜索 0 并返回 0 的位置并完成,因此我的代码将返回字符串 B3:B1 而不仅仅是 @987654329 @。

另外,我不能只使用像 Left(RangeOfInterest, 1) 这样的固定解决方案来获得 B,因为代码应该适用于任何范围,一旦你到达 Z,列字母就会变成双倍并且像 AA、AB等等。

我认为另一种选择是循环,但我所有的尝试都导致了非常复杂的代码片段,而这似乎有一个非常简单的解决方案。另外,如果可能的话,我想避免循环,尽管如果没有其他选择也没关系。我非常感谢任何解决此问题的建议。

【问题讨论】:

  • 列功能试过了吗?
  • 根据上面@Solar Mike 的建议,一旦你有了列号——比如说你叫它ColNum——那么得到这封信就相对容易了。 ColumnLetter = Split(Cells(1, ColNum).Address, "$")(1)

标签: excel vba


【解决方案1】:

更多情况下,人们希望列数而不是其名称,因为如果您向 Excel 提供名称,它会将其转换为相应的数字以进行处理。因此,我希望您不需要该名称来使用 VBA 寻址单元格。无论如何,给你:-

 Dim RangeOfInterest As String
    
    RangeOfInterest = Worksheets("Sheet2").Range("Table1[Column1]").EntireColumn.Address(0, 0)
    RangeOfInterest = Split(RangeOfInterest, ":")(0)
    Debug.Print RangeOfInterest

【讨论】:

  • 是的!我确实更喜欢使用列号而不是字母。我的问题是我正在修补一个宏而不是创建一个新宏,并且编写它的人有点硬编码了很多东西,而改变它会破坏一切。您的解决方案完美运行,非常感谢。
猜你喜欢
  • 2015-07-17
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多