VBA Excel:非活动表单和未知的行数。如果单元格包含值,则执行计算并将新值插入同一行上的单元格中
我尽力搜索答案,但无法获得所需内容。我对VBA很陌生,所以在这里的几个地方可能会出错。 。 。VBA Excel:非活动表单和未知的行数。如果单元格包含值,则执行计算并将新值插入同一行上的单元格中
我正在创建一个数据格式化程序,每次使用它时都会使用不同数量的记录(行)处理数据。数据将位于非活动表单上。第一行有标题。我已经成功地使用类似的代码来识别下面的代码来确定其上有特定数据的行,并清除该行上其他单元格的内容。
我提到E列的原因是因为它是每个记录中都有数据的唯一列。然后我必须找到BU列中有值的行,然后将该值乘以20,并将结果插入同一行的BX列。
我一直得到运行时错误13,但不明白,因为它只是一个在单元格BU中有两位小数的数字,目前在BX中没有任何内容。
Sub CalcTotalLTA()
Dim i As Variant
'counts the no. of rows in E and loops through all
For i = 1 To Sheets("Input").Range("E2", Sheets("Input").Range("E2").End(xlDown)).Rows.Count
'Identifies rows where columns BU has a value
If Sheets("Input").Cells(i, 73).Value <> "" Then
'calculate Total LTA
Sheets("Input").Cells(i, 76).Value = Sheets("Input").Cells(i, 73).Value * 20
End If
Next i
End Sub
你最有可能有一个问题,因为Application.Sheets
同时拥有表类型,这是Charts
和Worksheets
。 Application.Sheets
没有.Range()
属性。
将Sheets()
的所有实例替换为Worksheets()
。
Worksheets("Input").Cells(i, 76).Value = Worksheets("Input").Cells(i, 73).Value * 20
更妙的是:
Dim ws as Worksheet
Set ws = Worksheets("Input")
..
ws.Cells(i,76).Value = ws.Cells(i,73).Value * 20
排除标题行范围从
Public Function rngExcludeHeaders(rng As Range) As Range
Set rng = rng.Offset(1, 0).Resize(rng.rows.count - 1, rng.Columns.count)
Set rngExcludeHeaders = rng
End Function
用法:
Dim MyRange as Range
Set MyRange = rngExcludeHeaders(ws.UsedRange)
感谢您的回复,我已将其中一个标签更新为“工作表”。我已经尝试了上述两个建议,我仍然有运行时错误13在下面的行:ws.Cells(i,76).Value = ws.Cells(i,73).Value * 20 – CodeyMcCode
try'Debug 。在自己的行上打印ws.Cells(i,73).Value * 20'并逐步完成调试。如果它的错误,那么你的数据可能是罪魁祸首。它可能是一个以文本形式存储的数字,或者可能在其周围有“引号”,或者它可能有一个引导撇号的引号。 –
我试图把这个地方,但我得到一个语法错误。我把这个放在整个开始,然后走进来,在'立即'窗口底部返回'真'。现在我该怎么做? – CodeyMcCode
试试这样说:
Option Explicit
Sub CalcTotalLTA()
Dim i As Long
With Worksheets("Input")
For i = 1 To .Range("E2", .Range("E2").End(xlDown)).Row
If .Cells(i, 3) <> "" Then
.Cells(i, 6) = .Cells(i, 3) * 20
End If
Next i
End With
End Sub
这是我已经改变了:在上面
- 添加选项明确我已经使用工作表(“输入”),以使你的代码更容易理解。
- 此外,我想你不需要做
Rows.Count
但.Row
- 我已经改变
76
和73
到3
和6
避免一些向右滚动,这样当你用它在你的工作簿要小心。 - 删除
.Value
只要它是默认值。
谢谢你的回复,代码看起来更整洁。我对将73和76改为3和6有点困惑。我认为73和76表示我指的是专栏?我正在使用的文件是一个模板,直到列'CA'。我使用73和76来指代BU和BX列。 。 。 – CodeyMcCode
@CodeyMcCode - 只需更换73和76。我用它们,因为我不想滚动到“BU”和“BX”。 – Vityata
感谢@Adam Vincent和@Vityata的投入,以及其他一些研究(我自己解决这个问题的原因,希望这不是坏礼节)我找到了解决方案。启动索引“我”在2,并在结尾处增加1避免了标题行的文本,包括最后一行太:
Option Explicit
Sub CalcTotalLTA()
Dim i As Variant
Dim ws As Worksheet
Set ws = Worksheets("Input")
'counts the no. of rows in E and loops through all
For i = 2 To ws.Range("E2", ws.Range("E2").End(xlDown)).Rows.Count + 1
'Identifies rows where columns BU has a value
If ws.Cells(i, 73).Value <> "" Then
'calculate Total LTA
ws.Cells(i, 76).NumberFormat = "0.00"
ws.Cells(i, 76).Value = ws.Cells(i, 73).Value * 20
End If
Next i
End Sub
回答你自己的问题是完全可以接受的。如果其他答案有助于确定您的最终解决方案,那么对他们进行升级是很好的礼仪。 –
你可能想改变'表(“输入”)范围(“E2” ,表格(“Input”)。Range(“E2”)。End(xlDown)).Rows.Count'。如果数据在第1行和/或第2行,它将返回1048575.因此,如果您的数据表为空,它将对表单中的所有行进行操作。也许可以试试'sheets(“Input”)。cells(sheets(“Input”)。rows.count,5).end(xlup).row',它会给你最后一行包含列E中的数据(第5列) 。 –
如果您发现某个答案对您有帮助或回答您的问题,请将其标记为答案。 –