VBA 公式使用 sheet 数字而不是 sheet 名称

VBA formula using sheet number instead of sheet name

我正在使用 VBA 编写一个宏,它完全按照我的意愿工作,除了我希望我的公式循环遍历 sheet 而不是使用 [= 上的数据27=],'SAFO-1'指的是鱼Salvelinus fontinalis(SAFO)。我有很多鱼种(例如,Morone saxatilis (MOSA)),如果我可以参考 sheet 编号而不是它们的名称,那将更加实用。不幸的是,我没有决定 sheet 个名称,它们必须保持原样,因为我们正在为每个样本使用唯一名称的共享项目。工作表名称在项目之间发生变化,我希望能够在所有项目中使用我的代码。这是我当前的代码:

Sub Mean()
    
    Dim i As Integer
    Dim j As Integer
    Dim k As Integer
    Dim Sheet As Integer
    
    k = 4
    i = Application.Sheets.Count
    
    For Sheet = 2 To i
        Worksheets(Sheet).Select
        j = 3
            Do While ActiveCell.Value <> "0"
                Range("A" & j).Select
                If ActiveCell.Value = "0" Then
                    Range("A1").Copy
                    Worksheets("Mean").Range("A" & Sheet + 1).PasteSpecial Paste:=xlPasteValues
                    Worksheets("Mean").Range("B" & Sheet + 1).Formula = "=(('SAFO-1'!B80)-('SAFO-1'!B75))"
                    Worksheets("Mean").Range("C" & Sheet + 1).Formula = "=(('SAFO-1'!C80)-('SAFO-1'!C75))"
                    For k = 4 To 41
                        Worksheets("Mean").Cells(Sheet + 1, k).FormulaR1C1 = "=AVERAGE('SAFO-1'!R" & j + 10 & "C" & k & ":R" & j - 9 & "C" & k & ")"
                    Next k
                Else
                j = j + 1
                End If
            Loop
    Next Sheet
    Range("B1:AP2").Copy Worksheets("Mean").Range("A1")
    Worksheets("Mean").Select
End Sub

我的想法是将 'SAFO-1' 替换为 'Sheet1',以便最终能够编写如下内容:

Worksheets("Mean").Cells(Sheet + 1, k).FormulaR1C1 = "=AVERAGE('Sheet "& Sheet")'!R" & j + 10 & "C" & k & ":R" & j - 9 & "C" & k & ")"

提前致谢!

威廉·福廷

首先,我们将停止使用 .Select,而是使用对象句柄。我不完全确定你的 sheet 的名称从何而来,但我假设它与循环有关并以此为例。我们使用它的编号 Set currentSheet = Worksheets(Sheet) 在 sheet 上获得一个对象句柄,然后我们可以获取它的名称并在公式 currentSheet.Name.

中需要的地方使用它

我希望即使这段代码不是一个完整的解决方案,它也会向您展示如何到达目的地。

Option Explicit

Public Sub Mean()
    
    Dim j As Long
    Dim k As Long
    Dim Sheet As Long
    
    k = 4
    
    For Sheet = 2 To Application.Sheets.Count
        Dim currentSheet As Worksheet
        Set currentSheet = Worksheets(Sheet)
        j = 3
        
        Do
            Dim currentCell As Range
            Set currentCell = currentSheet.Range("A" & j)
            If currentCell.Value = "0" Then
                With Worksheets("Mean")
                    .Range("A" & Sheet + 1).Value = currentSheet.Range("A1").Value
                    .Range("B" & Sheet + 1).Formula = "=(('" & currentSheet.Name & "'!B80)-('" & currentSheet.Name & "'!B75))"
                    .Range("C" & Sheet + 1).Formula = "=(('" & currentSheet.Name & "'!C80)-('" & currentSheet.Name & "'!C75))"
                    For k = 4 To 41
                        .Cells(Sheet + 1, k).FormulaR1C1 = "=AVERAGE('" & currentSheet.Name & "'!R" & j + 10 & "C" & k & ":R" & j - 9 & "C" & k & ")"
                    Next k
                End With
            Else
                j = j + 1
            End If
        Loop While currentCell.Value <> "0"
    Next Sheet
    
    currentSheet.Range("B1:AP2").Copy Worksheets("Mean").Range("A1")
    Worksheets("Mean").Select
End Sub

我们可以在 VBA 中创建一个工作表名称数组,并使用它们来创建我们放入工作表中的公式。例如:

Sub useNumber()
    sh = Array("big worksheet name", "collosal worksheet name", "mammoth worksheet name", "tiny worksheet name")
    Sheets("Sheet1").Range("A1").Formula = "=SUM('" & sh(1) & "'!A3:A6)"
End Sub

如果您有很多工作表,请使用 For 循环而不是 Array() 函数来填充数组。

运行 这会创建:

=SUM('collosal worksheet name'!A3:A6)

Sheet1 单元格 A1

这种方法使遍历数据表更容易:

Sub useNumberloop()
    sh = Array("big worksheet name", "collosal worksheet name", "mammoth worksheet name", "tiny worksheet name")
    
    For i = 1 To 4
        Sheets("Sheet1").Range("A" & i).Formula = "=SUM('" & sh(i - 1) & "'!A3:A6)"
    Next i
End Sub