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
我正在使用 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