1

我需要编写一个电子表格,当您按下按钮时会添加一行数据并询问计算所需的参数,但我似乎无法让它填写下一行的数据?我是 excel 中宏的完整初学者,并且只在我的 uni 课程中为 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
4

1 回答 1

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',rows是向右偏移的行数(使用负数向左偏移),columns是要偏移的列数向下(使用负数抵消向上)。因此,.offset(0, 0)偏移值无处可寻。

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

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

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

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

于 2013-07-24T09:13:10.733 回答