在我正在尝试编写的程序中,我会使用两列数字并对它们执行计算。在用户告诉我之前,我不知道这两列的位置(他们在我的代码所在的工作簿中的单元格中输入列值)。
例如,如果用户输入“A”和“B”作为所有信息所在的列,则可以基于这些值执行计算。同样,如果他们想要分析另一个工作表(或工作簿),并且列在“F”和“G”中,他们可以输入这些。问题是我要求用户输入这两列以及另外四列(最后四列是结果列)。我之所以这样做,是因为我希望能够灵活变通,但现在缺乏灵活性。
我的问题是,如果给出某个信息的值(让我们说“F”),我怎么能弄清楚该输入值之后或之前的列。因此,如果我只给出“F”,我将能够创建一个变量来保存“G”列。
以下是在我需要执行此新问题之前变量如何工作的示例:
Dim first_Column As String
Dim second_Column As String
Dim third_Column As String
first_Column = Range("B2").Text
second_Column = Range("B3").Text
third_Column = Range("B4").Text
这里,单元格B2-B4是用户输入值的位置。一般来说,我希望能够不再拥有B3和B4。我觉得Offset(0,1)可能能够以某种方式提供帮助,但到目前为止我还是无法正确实现它。
谢谢,
Jesse Smothermon
答案 0 :(得分:2)
您与Offset
走在了正确的轨道上。这是一个测试函数,它显示了几种不同的方法:
Sub test()
Dim first_Column As String
Dim second_Column As String
Dim third_Column As String
Dim r As Range
first_Column = Range("B2").Text
second_Column = Range("B2").Offset(1, 0).Text
third_Column = Range("B2").Offset(2, 0).Text
Debug.Print first_Column, second_Column, third_Column
Set r = Range("B2")
first_Column = r.Text
Set r = r.Offset(1, 0)
second_Column = r.Text
Set r = r.Offset(1, 0)
third_Column = r.Text
Debug.Print first_Column, second_Column, third_Column
End Sub
更新:重新阅读您的问题后,我意识到您正在尝试根据用户输入的专栏信函进行抵消。 @ rskar的答案将改变列字母,但在代码中使用列号会更容易。例如:
Sub test()
Dim first_Col As Integer, second_Col As Integer
first_Col = Cells(, Range("B2").Text).Column
second_Col = first_Col + 1
Cells.Columns(first_Col).Font.Bold = True
Cells.Columns(second_Col).Font.Italic = True
End Sub
答案 1 :(得分:2)
以下两个函数可以帮助您处理列> “Z”。它们将列的文本形式转换为列索引(作为Long值),反之亦然:
Function ColTextToInt(ByVal col As String) As Long
Dim c1 As String, c2 As String
col = UCase(col) 'Make sure we are dealing with "A", not with "a"
If Len(col) = 1 Then 'if "A" to "Z" is given, there is just one letter to decode
ColTextToInt = Asc(col) - Asc("A") + 1
ElseIf Len(col) = 2 Then
c1 = Left(col, 1) ' two letter columns: split to left and right letter
c2 = Right(col, 1)
' calculate the column indexes from both letters
ColTextToInt = (Asc(c1) - Asc("A") + 1) * 26 + (Asc(c2) - Asc("A") + 1)
Else
ColTextToInt = 0
End If
End Function
Function ColIntToText(ByVal col As Long) As String
Dim i1 As Long, i2 As Long
i1 = (col - 1) \ 26 ' col - 1 =i1*26+i2 : this calculates i1 and i2 from col
i2 = (col - 1) Mod 26
ColIntToText = Chr(Asc("A") + i2) ' if i1 is 0, this is the column from "A" to "Z"
If i1 > 0 Then 'in this case, i1 represents the first letter of the two-letter columns
ColIntToText = Chr(Asc("A") + i1 - 1) & ColIntToText ' add the first letter to the result
End If
End Function
现在您的问题可以轻松解决,例如
newColumn = ColIntToText(ColTextToInt(oldColumn)+1)
根据mwolfe02的评论编辑:
当然,如果您对列名不感兴趣,但只想获取用户给出的列下方给定行中特定单元格的范围对象,则此代码“过度杀伤”。在这种情况下,一个简单的
Dim r as Range
Dim row as long, oldColumn as String
' ... init row and oldColumn here ...
Set r = mysheet.Range(oldColumn & row).Offset(0,1)
' now use r to manipulate the cell right to the original cell
会这样做。
答案 2 :(得分:2)
@ rskar的回答有一些语法问题。但是,基于输入列“字母”和右边所需的偏移量,它有助于生成一个抓取列“字母”的函数:
Public Function GetNextCol(TheCol As String, OffsetRight As Integer) As String
Dim TempCol1 As String
Dim TempCol2 As String
TempCol1 = Range(TheCol & "1").Address
TempCol2 = Range(TempCol1).Offset(0, OffsetRight).Address(0, 0, xlA1)
GetNextCol = Left(TempCol2, Len(TempCol2) - 1)
End Function
答案 3 :(得分:1)
根据其他人的评论(并且他们都提出了有效的观点),使用Offset
和Address
来解决问题是一个更好的解决方案:
Dim first_Column As String
Dim second_Column As String
Dim p As Integer
first_Column = Range("B2").Text
second_Column = _
Range(first_Column + ":" + first_Column).Offset(0, 1).Address(0, 0, xlA1)
p = InStr(second_Column, ":")
second_Column = Left(second_Column, p - 1)
以上内容适用于任何有效的列名,包括“Z”和“AA”等。
答案 4 :(得分:0)
在VBA中使用Asc()和Chr()函数,如下所示:
Dim first_Column As String
Dim second_Column As String
first_Column = Range("B2").Text
second_Column = Chr(Asc(first_Column) + 1)
Asc(
s )
函数返回字符串“s”的第一个字符的ASCII代码(整数,通常在0到255之间)。
Chr(
c )
函数返回一个字符串,其中包含与给定代码“c”对应的字符。
大写字母(A至Z)是ASCII代码65至90.只需谷歌ASCII以获取更多详细信息。
注意:只要first_Column位于“A”和“Y”之间,上述代码就可以了。对于列“AA”等,它将需要更多的工作,但Asc()和Chr()仍将是编码的门票。