Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 基于VBA内部条件和粘贴值求和_Excel_Vba - Fatal编程技术网

Excel 基于VBA内部条件和粘贴值求和

Excel 基于VBA内部条件和粘贴值求和,excel,vba,Excel,Vba,我试图想出一些代码,将vba中不同工作表中的所有值相加,并将它们粘贴为值。我希望一次运行每一行(一行都有相同的条件,只是根据列号从不同的位置获取数据) 如何以这种方式运行基于条件的总和 Dim i as Integer 'Rows Dim n as Integer 'Column For i = 9 To 24 For n = 3 To 21 Next Next 老实说,我不确定这是否回答了您的问题,但它确实粘贴了值而不是公式。宏使用公式(如现在所示)或值(使用相同的公式)

我试图想出一些代码,将vba中不同工作表中的所有值相加,并将它们粘贴为值。我希望一次运行每一行(一行都有相同的条件,只是根据列号从不同的位置获取数据)

如何以这种方式运行基于条件的总和

Dim i as Integer 'Rows
Dim n as Integer 'Column

For i = 9 To 24
    For n = 3 To 21

    Next
Next

老实说,我不确定这是否回答了您的问题,但它确实粘贴了值而不是公式。宏使用公式(如现在所示)或值(使用相同的公式)填充sheet1上的19 x 16矩阵。通过注释循环末尾的相关行来选择哪种方法。将代码放在空工作簿中并运行测试宏,这将在工作表2中生成一些测试数据,并在工作表1中生成摘要。据我所知,这两种方法几乎没有什么不同,这意味着其他一些东西可能会导致你反应缓慢

Option Explicit
Sub test()

  Const MONTHS = 19

  testdata MONTHS, 1000 ' generate some data on sheet2

  Dim ws As Worksheet, wsData As Worksheet
  Dim r As Integer, c As Integer
  Dim f1 As String, f2 As String, f3 As String
  Dim col As String, a1 As String, a2 As String
  Dim src As String, mth As Integer

  Set ws = ThisWorkbook.Sheets("Sheet1")
  ws.Cells.Clear

  src = ws.Range("B5")
  If src = "" Then src = "Sheet2"
  Set wsData = ThisWorkbook.Sheets(src)

  For r = 1 To 16
    ws.Range("B" & r + 8) = "Category_" & r
    For mth = 1 To 19
      If r = 1 Then ws.Cells(8, mth + 2) = "Month " & mth

      c = mth + 4
      a1 = Chr(65 + (c - 1) Mod 26)
      a2 = ""

      ' generate column as letters (up to ZZ)
      If c > 26 Then a2 = Chr(64 + Int((c - 1) / 26))
      col = a2 & a1 & ":" & a2 & a1
      f1 = src & "!" & col
      f2 = src & "!AI:AI"
      f3 = "B" & r + 8

      ws.Cells(r + 8, mth + 2).Formula = "=SUMIFS(" & f1 & "," & f2 & "," & f3 & ")"
      'ws.Cells(r + 8, mth + 2) = WorksheetFunction.SumIfs(Range(f1), Range(f2), ws.Range(f3).Value)
    Next
  Next

  MsgBox "Finished"

End Sub

Sub testdata(mth As Integer, i As Long)
  ' sheet2 data
  Dim ws, r, c
  Set ws = ThisWorkbook.Sheets("Sheet2")
  ws.Cells.Clear
  For r = 2 To i
    ws.Range("AI" & r) = "Category_" & (1 + Int(Rnd() * 16))
    For c = 5 To 4 + mth
      ws.Cells(r, c) = Int(Rnd() * 100)
    Next
  Next
End Sub

这样的循环会非常慢。a) 你为什么不用公式呢?公式是Excel的强项,与VBA相比速度非常快。b) 如果你需要某种自动化,你甚至可以用VBA编写公式c)如果你真的必须使用VBA,请使用请分享一些您为什么必须这样做以及为什么必须使用VBA的背景信息,以便我们可以提供合适的答案。如果游戏中出现了条件,也会有
=SUMIF()
=SUMIFS()
公式。或者作为VBA的等价物和。这些公式使得excel速度非常慢,因为它补充了条件格式,文件基本上是自己拖动的。我试图想出一些解决方案,只需使用字典或循环来运行,然后就可以使用主要值分析文件。尝试一下工作表函数。我想一个循环会更慢。你可以看看,从每张表中获取数据,然后从数组中求和。直接访问工作表上的单元格可能非常慢(如果要访问的单元格很多)。如果您在不同的页面上发布数据示例,并提供有关代码的更多详细信息,我们可以提供更多建议。