【问题标题】:Excel VBA How to select variable range of cellsExcel VBA如何选择可变范围的单元格
【发布时间】:2015-02-23 21:36:18
【问题描述】:

我试图搜索这个问题,但没有找到类似的问题。

我还是 VBA 的新手,我正在尝试创建宏,它根据用户的输入选择单元格范围,然后从这些选定的单元格中创建一个轮廓网格。

我的 Excel 工作簿中有两个 ActiveX 按钮,可让用户输入他们想要使用的网格大小(宽度和高度)。我正在努力将上述宽度和高度包含在我的代码中。以下是按钮的代码(没有不清楚的地方):

Private Sub Height_Click()
Dim Height As Integer
Height = InputBox("Syötä ruudukon korkeus", "Ruudukon korkeus", "Syötä tähän")
Range("E5") = Height
End Sub

和宽度按钮:

Private Sub Width_Click()
Dim Width As Integer
Width = InputBox("Syötä ruudukon leveys", "Ruudukon leveys", "Syötä tähän")
Range("E2") = Width
End Sub

我希望我的网格从单元格“G2”开始并从那里向右和向下扩展并更改所选单元格的大小。但是我编写的代码根本不起作用(正如我所想的那样)。代码如下:

Private Sub CreateGrid_Click()
Columns("G:G+E2").Select
    Selection.ColumnWidth = 1
Rows("2:2+E5").Select
    Selection.RowHeight = 1
End Sub

单元格“E2”和“E5”分别打印了宽度和高度值。当我单击 CreateGrid 按钮时没有任何反应。有什么想法可以让这段代码工作吗?非常感谢所有答案。

-提姆

【问题讨论】:

    标签: excel range cell vba


    【解决方案1】:

    诀窍是使用录制宏按钮。 此功能将记录您在录制时使用 excel 书所做的所有指令 例子: 1.- 启动录制宏并输入宏的名称。 2.- 选择任何单元格并输入一个值 3.- 选择您想要的一系列单元格 4.- 按停止宏录制。 5.- 按 Alt +F11 你会看到 excel 生成你所做的代码 在打开宏录制的 Excel 中,您甚至可以知道如何在单元格内键入值或选择其中的范围。

    【讨论】:

    • 我无法通过记录来创建这个工作宏,因为我必须将单元格“E2”和“E5”中的变量添加到选择范围参数中,至少我不知道你是怎么做的无需在 VBA 中编写自己的代码即可包含该信息。无论如何,感谢您的挑衅性建议。
    【解决方案2】:

    编辑:

    Private Sub CreateGrid_Click()
    Range("G2:" & Range("G2").Offset(Range("E5").Value,Range("E2").Value).Addresslocal).Select
    End Sub
    

    如果这不符合您的预期,请告诉我,我会尽力帮助纠正它。

    【讨论】:

    • 您好,感谢您的回复。我试过你的建议,但没有成功。它只选择了远离单元格 G2 的“E2”和“E5”范围的目标列/行。因此,宽度为 24,高度为 30 时,受影响的区域是 AE 列一直到 1048576,第 30 行一直到 XFD。
    • 您要选择整个单元格范围,G2:AE30?
    • 是的,从 G2:AE30 开始的整个系列
    • 我更改了代码。请参阅我上面的编辑。这将按照您的预期选择整个范围。
    • 当然,我的荣幸!
    【解决方案3】:

    您要查找的命令是Range().Select,但您需要创建插入括号的字符串。因此,如果我理解正确,您已将要从 G2 偏移的行数和列数存储在变量中吗?

    为了得到列字母,你可以使用微软提供的函数here

    Function ConvertToLetter(iCol As Integer) As String
       Dim iAlpha As Integer
       Dim iRemainder As Integer
       iAlpha = Int(iCol / 27)
       iRemainder = iCol - (iAlpha * 26)
       If iAlpha > 0 Then
          ConvertToLetter = Chr(iAlpha + 64)
       End If
       If iRemainder > 0 Then
          ConvertToLetter = ConvertToLetter & Chr(iRemainder + 64)
       End If
    End Function
    

    但由于您是从 G 开始的,因此您必须像这样调用函数:

    ConvertToLetter(7+numerColumns)
    

    您的最终代码将如下所示

    Range("G" & 2 + numberLines & ":" & ConvertToLetter(7+numberCols) & numberLines).Select
    

    其中 numberLines 是要偏移的行数,而 numberCols 是列数。

    编辑: 正如@Kyle 所指出的,一种更短的方法是使用:

    Range("G2").Offset(numberLines,numberCols).Select
    

    【讨论】:

    • 这是一个很好的答案。您也可以直接引用单元格 G2 并使用 .Offset() 属性来选择网格的另一个边界。
    • @Teemu Niskanen 这看起来像:Range("G2").Offset(numberLine,numberCols).Select 如图所示here
    • 我在下面发布了一个答案,代码在上面的 Teemu 子过程中实现。只会加宽与用户输入的“宽度”和“高度”相对应的行和列。网格内还需要发生什么其他事情吗?
    猜你喜欢
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多