如何使用宏填充电子表格中列表的下一行?

时间:2013-07-24 09:05:54

标签: excel vba

我需要编写一个电子表格,当你按下一个按钮时会添加一行数据并询问计算所需的参数,但我似乎无法将其填入下一行的数据中?我是excel中宏的完全开端,并且在我的单一课程上只为matlab做了非常基本的编程。 到目前为止我的脚本如下:

Sub AddPosTol()

' AddPosTol Macro


Dim rngSeek As Range

Set rngSeek = Range("B1")

While rngSeek <> ""
    'If the cell isn't empty, drop down one row:
    rngSeek = rngSeek.Offset(1, 0)
End

With rngSeek.Offset(0, 1)
   With .Font
       .Name = "Solid Edge ANSI1 Symbols"
       .Size = 11
       .Value = 1
   End With                                            <--added this

End With

'don't need to call Range() around rngSeek - it is already a range type

rngSeek.Offset(0, 3) = "=RC[-1]"
rngSeek.Offset(0, 4) = "0"

With rngSeek.Offset(1, 1)
    .Font.Bold = True                <--don't really need a With if only one statement
End With

'can use a With statement here if you want:

With rngSeek

    .Offset(1, 1) = "X value"
    .Offset(2, 1) = "Y Value"

    .Offset(0, 4) = "=2*SQRT((R[1]C[-3]-R[1]C)^2+(R[2]C[-3]-R[2]C)^2)"
    .Offset(0, 5) = "=2*SQRT((R4C3-R[1]C)^2+(R5C3-R[2]C)^2)"
    .Offset(0, 6) = "=2*SQRT((R[1]C[-3]-R[1]C)^2+(R[2]C[-3]-R[2]C)^2)"
    .Offset(0, 7) = "=2*SQRT((R[1]C[-3]-R[1]C)^2+(R[2]C[-3]-R[2]C)^2)"
    .Offset(0, 8) = "=2*SQRT((R4C3-R[1]C)^2+(R5C3-R[2]C)^2)"

    .Offset(0, 2) = (InputBox("Insert Positional Tolerance Diametre"))
    .Offset(1, 2) = (InputBox("Insert X value on drawing"))
    .Offset(2, 2) = (InputBox("Insert Y value on drawing"))

End With

End Sub

1 个答案:

答案 0 :(得分:1)

好的,我会稍微重构你的代码以使其更具可读性,并尝试回答你的问题。

首先,我相信lastrow = Worksheets("Sheet1").Rows.Count将返回工作表中行数,而不是您当前填写的行数。当我运行该行时,我回到了1048576 !要查找第一个行,我们需要找到一个肯定会为每一行填充值的列;然后,在该列中循环查找一个空单元格:这是您的第一个空行:

Dim rngSeek as range

set rngSeek = Range("A1") <--your starting cell

While rngSeek <> ""
    'If the cell isn't empty, drop down one row:
    rngSeek = rngSeek.Offset(1, 0)
Wend

'rngSeek is now sitting at the first row that has a blank in column A

因此,这项技术将为我们找到我们正在寻找的第一行。然后,我们只用数据填充该行。您可以利用上面代码段中的其他元素,以便在更新时更轻松:具体来说,.offset方法:

您的代码:

With rngSeek.offset(0, 2)
    With .Font
        .Name = "Solid Edge ANSI1 Symbols"
        .Size = 11
    End With

    .value = 1
End With

'repeat for all cells: no need to select them first, just use .offset

仅供参考.Offset如此:

Range("Cell Reference").Offset(rows, columns)

'Cell Reference'可以是任何单元格,如'A1'或'D24',行是向右偏移的行数(使用负数向左偏移)和列是要偏移向下的列数(使用负数来向上偏移)。因此.offset(0, 0)的值偏移到了无处。

编辑:您不能使用A列来寻找第一个空白单元格;如果是,请调整offset值以反映您想要更改其值的单元格。值为1将向右偏移一列或向下偏移一行,-1将偏移一列或一行向上

ADDITION:最好使用Range("A1").End(xlDown)代替循环来查找第一个空白单元格。将范围变量设置为等于此值,并将循环替换为:

set rngSeek = Range("A1").End(xlDown).Offset(1, 0)

然后您可以按照上述方式使用rngSeek。 (您也可以将rngSeek重命名为任何变量名称。)