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 
+0

你可能想改变'表(“输入”)范围(“E2” ,表格(“Input”)。Range(“E2”)。End(xlDown)).Rows.Count'。如果数据在第1行和/或第2行,它将返回1048575.因此,如果您的数据表为空,它将对表单中的所有行进行操作。也许可以试试'sheets(“Input”)。cells(sheets(“Input”)。rows.count,5).end(xlup).row',它会给你最后一行包含列E中的数据(第5列) 。 –

+0

如果您发现某个答案对您有帮助或回答您的问题,请将其标记为答案。 –

你最有可能有一个问题,因为Application.Sheets同时拥有表类型,这是ChartsWorksheetsApplication.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) 
+0

感谢您的回复,我已将其中一个标签更新为“工作表”。我已经尝试了上述两个建议,我仍然有运行时错误13在下面的行:ws.Cells(i,76).Value = ws.Cells(i,73).Value * 20 – CodeyMcCode

+0

try'Debug 。在自己的行上打印ws.Cells(i,73).Value * 20'并逐步完成调试。如果它的错误,那么你的数据可能是罪魁祸首。它可能是一个以文本形式存储的数字,或者可能在其周围有“引号”,或者它可能有一个引导撇号的引号。 –

+0

我试图把这个地方,但我得到一个语法错误。我把这个放在整个开始,然后走进来,在'立即'窗口底部返回'真'。现在我该怎么做? – 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
    • 我已经改变767336避免一些向右滚动,这样当你用它在你的工作簿要小心。
    • 删除.Value只要它是默认值。
  • +1

    谢谢你的回复,代码看起来更整洁。我对将73和76改为3和6有点困惑。我认为73和76表示我指的是专栏?我正在使用的文件是一个模板,直到列'CA'。我使用73和76来指代BU和BX列。 。 。 – CodeyMcCode

    +0

    @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 
    
    +0

    回答你自己的问题是完全可以接受的。如果其他答案有助于确定您的最终解决方案,那么对他们进行升级是很好的礼仪。 –