VBA根据输入值查找下一列

时间:2011-03-02 21:20:27

标签: excel vba

在我正在尝试编写的程序中,我会使用两列数字并对它们执行计算。在用户告诉我之前,我不知道这两列的位置(他们在我的代码所在的工作簿中的单元格中输入列值)。

例如,如果用户输入“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

5 个答案:

答案 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)

根据其他人的评论(并且他们都提出了有效的观点),使用OffsetAddress来解决问题是一个更好的解决方案:

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()仍将是编码的门票。