【问题标题】:Excel VBA Error Doing Multiple Row MultiplicationExcel VBA错误执行多行乘法
【发布时间】:2016-06-27 19:51:34
【问题描述】:

遇到“类型不匹配”错误。

尝试在一个工​​作表“Sheet1”上取一个数字矩阵,除以第二个工作表“Sheet2”上的另一个数字矩阵,然后在第三个工作表“Sheet1”的矩阵上显示每个单元格结果

Sub MacroTest()

Worksheets("Sheet3").Range("C5") = Worksheets("Sheet1").Range("C5:DR124") / Worksheets("Sheet2").Range("C5:DR124")

End Sub

【问题讨论】:

  • 不应该将其标记为 Excel-VBA 吗?
  • 谢谢,它已修复,现在标记为这样

标签: excel macros excel-formula vba


【解决方案1】:

使用此代码,您可以在不同工作表和同一张工作表上的特定范围(您可以选择)上执行您需要的操作。

Sub RangeDiv()
    Dim RngFrom As Range
    Dim RngDiv As Range
    Dim RngTo As Range

    Dim R As Integer
    Dim C As Integer

    Set RngFrom = Sheets(1).Range("A1:E3")
    Set RngDiv = Sheets(1).Range("B6:F8")
    Set RngTo = Sheets(1).Range("C10:G12")

    'Check if all Rngs have the same number of rows and columns
    If RngFrom.Rows.Count <> RngDiv.Rows.Count Or RngFrom.Rows.Count <> RngTo.Rows.Count Then
        MsgBox ("Rngs rows number aren't equal")
        Exit Sub
    End If
    If RngFrom.Columns.Count <> RngDiv.Columns.Count Or RngFrom.Columns.Count <> RngTo.Columns.Count Then
        MsgBox ("Rngs columns number aren't equal")
        Exit Sub
    End If

    For C = 1 To RngFrom.Columns.Count
        For R = 1 To RngFrom.Rows.Count
            'check cell value to avoid errors coming from dividing by 0
            If Val(RngDiv.Cells(R, C)) <> 0 Then
                RngTo.Cells(R, C) = RngFrom.Cells(R, C) / RngDiv.Cells(R, C)
            Else
                'Insert something when division is impossible
                RngTo.Cells(R, C) = 0 'Or what you want to insert
            End If
        Next R
    Next C
End Sub

【讨论】:

  • 我的单元格中有空白字段,我无法做任何事情,所以这给了我一个溢出错误。我重写了它以包含一个 if/then 循环来捕获空值,但我最终得到了一个充满零的矩阵 - 写这个的正确方法是什么? For C = 1 To RngFrom.Columns.Count For R = 1 To RngFrom.Rows.Count If IsEmpty(RngTo.Cells(R, C)) = True Then RngTo.Cells(R, C) = 0 Else RngTo.Cells( R, C) = RngFrom.Cells(R, C) / RngDiv.Cells(R, C) End If
  • @Danimov82 我编辑了我的代码以防止除以 0
【解决方案2】:

我像这样创建 sheet1

Please click to see Image

然后是sheet2

Please click to see Image2

然后创建空白表 3

并使用此代码

Sub divideRange()
    Dim lastRow, lastColumn As Long

    lastColumn = Sheets("Sheet1").Cells(1, Columns.Count).End(xlToLeft).Column
    lastRow = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row

    For i = 1 To lastRow
        For j = 1 To lastColumn
            Sheets("Sheet3").Cells(i, j).Value = Sheets("Sheet1").Cells(i, j).Value / Sheets("Sheet2").Cells(i, j).Value
        Next j
    Next i

End Sub

这是你想要的吗?

【讨论】:

  • 快速跟进 - 如果我将 C3 上的两个表格作为左上角开始,并在矩阵的右下角作为 DR124 结束 - 这个脚本的外观会有什么不同?我问的唯一原因是运行它会导致溢出错误,所以我认为这是因为矩阵的设置与您的示例不同。
  • 我有一些单元格中包含 0,所以这可能是因为公式试图除以零。我将如何绕过带有空格/ 0 的单元格?我无法摆脱它们,因为它是来自 power pivot 的填充数据集,因此需要添加某种“如果空白则忽略”功能,但不清楚它可能是什么样子。
【解决方案3】:

对不起,我的回复晚了。

你可以用for循环解决你的问题:

For i = 3 To 9
    If IsNumeric(Worksheets("Tabelle2").Cells(5, i).Value) And IsNumeric(Worksheets("Tabelle3").Cells(5, i).Value) And Worksheets("Tabelle3").Cells(5, i).Value <> 0 Then
        Worksheets("Tabelle1").Cells(5, i).Value = Worksheets("Tabelle2").Cells(5, i).Value / Worksheets("Tabelle3").Cells(5, i).Value
    End If
Next

变量 i 是您作为数字的列。 A = 1, B = 2, Z = 26, AA = 27 等等..
数字 5 是你的行

例如 Cells(5,1) 与 Range("A5") 或 Cells(3,9) = Range("I3") 相同

在我上面的代码中,它从 C (3) 列开始,到 I (9) 列停止。将数字 9 替换为 FX 列(您的最后一列)的编号并编辑表格名称,然后它应该可以工作。

【讨论】:

  • 通过以下修改得到相同的错误 Worksheets("Sheet1").Range("C5") = Worksheets("Month Gross Demand").Range("C5:FX5") / Worksheets("月订单数").Range("C5:FX5")
  • 我的意思是,它不可能使用“范围”。它只能用一个特定的列/行来计算。例如 C5 或 A3 或 B9 但不是 C5:FX5 或 A1:B3
  • 这些矩阵有数百个值,这需要我使用该方法编写数百行代码 - 必须有一种方法来构建更小的函数
  • 所以您想在 Sheet1 单元格 C5 中显示表格 Gross Demand 中 C5:FX5 的总和除以表格 Order Count 中 C5:FX5 的总和的结果?我理解正确吗?
  • 不,我想查看 Sheet 2 - C5 除以 Sheet 3 - C5 的值以显示在 Sheet 3 - C5 中,以此类推整个数字矩阵。所以 Sheet 3 - D5 将 Sheet 1 - D5 除以 Sheet 2 - D5 等等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-12
  • 2019-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
相关资源
最近更新 更多