Excel 复制粘贴宏正在引导';分组'-工作表功能?
我遇到了一个我无法理解的错误: 在我运行下面的宏之后,两个特定的字符串值被粘贴到所有工作表中相同的两个单元格中,尽管我确信工作表没有分组或不包含各自的代码。具体而言,项目“B12”和“B25”粘贴在同一单元格(A29和A30)的所有页面上(参见代码)。“B12”和“B25”与单元格位置无关,只是我的应用程序特有的标识符。它们是从一张图纸复制并粘贴到另一张图纸上的值。如果代码中存在复制+粘贴错误,那么我希望所有项目都有相同的错误,因为每个工作表都会调用“算法”子例程 有时,在不执行宏的情况下也会发生这种情况。当我试图将工作簿编辑回粘贴字段之前的状态时(通过单击每个单元格并键入以前的内容),它仍然会对所有工作表进行更改,即使我确信它们没有分组或运行代码Excel 复制粘贴宏正在引导';分组'-工作表功能?,excel,for-loop,grouping,copy-paste,vba,Excel,For Loop,Grouping,Copy Paste,Vba,我遇到了一个我无法理解的错误: 在我运行下面的宏之后,两个特定的字符串值被粘贴到所有工作表中相同的两个单元格中,尽管我确信工作表没有分组或不包含各自的代码。具体而言,项目“B12”和“B25”粘贴在同一单元格(A29和A30)的所有页面上(参见代码)。“B12”和“B25”与单元格位置无关,只是我的应用程序特有的标识符。它们是从一张图纸复制并粘贴到另一张图纸上的值。如果代码中存在复制+粘贴错误,那么我希望所有项目都有相同的错误,因为每个工作表都会调用“算法”子例程 有时,在不执行宏的情况下也会发
' Title: DSR AutoFill Macro
Sub autofill_DSR()
' Variable Declarations:
Dim x_count As Long
Dim n As Long
Dim item_a As String
Dim item_b As String
'Dim test_string As String
' Variable Initializations:
x_count = 0
Process_Control_NumRows = 15
Electrical_NumRows = 8
Environmental1_NumRows = 17
Env2_Regulatory_NumRows = 14
FIRE_NumRows = 15
Human_NumRows = 16
Industrial_Hygiene_NumRows = 16
Maintenance_Reliability_NumRows = 10
Pressure_Vacuum_NumRows = 16
Rotating_n_Mechanical_NumRows = 11
Facility_Siting_n_Security_NumRows = 10
Process_Safety_Documentation_NumRows = 3
Temperature_Reaction_Flow_NumRows = 18
Valve_Piping_NumRows = 22
Quality_NumRows = 10
Product_Stewardship_NumRows = 20
fourB_Items_NumRows = 28
'test_string = "NN"
' Main Data Transfer Code:
Sheets(Array("SUMMARY P.1", "SUMMARY P.2", "Process Control", _
"Electrical", "Environmental1", "Env.2 - Regulatory", "FIRE", _
"Human", "Industrial Hygiene", "Maintenance_Reliability", _
"Pressure_Vacuum", "Rotating & Mechanical", _
"Facility Siting & Security", "Process Safety Documentation", _
"Temperature-Reaction-Flow", "Valve-Piping", "Quality", _
"Product Stewardship", "4B ITEMS")).Select 'Create Array of all Sheets
'Sheets(Array("Sheet1", "Sheet2", "Sheet3")).Select ' For testing
' Process Control Sheet:
For n = 0 To (Process_Control_NumRows - 1) 'Cycle 16 times for each
'item row in process controls tab
Sheets("Process Control").Activate 'Choose specific sheet
Range("D15").Select 'Choose starting cell of "Yes" column
Call Module2.algorithm(n, x_count) 'Call on subroutine (see algorithm code)
Next n 'increment index to account for offset
' Electrical Sheet:
For n = 0 To (Electrical_NumRows - 1)
Sheets("Electrical").Activate
Range("D15").Select
Call Module2.algorithm(n, x_count)
If (x_count > 21) Then 'Abort autofill if too many items to hold
Sheets("SUMMARY P.1").Activate 'on both summary pages put together (21 count)
GoTo TooMany_Xs
End If
Next n
这将继续适用于所有图纸
' 4B ITEMS Sheet:
For n = 0 To (fourB_Items_NumRows - 1)
Sheets("4B ITEMS").Activate
Range("D16").Select ' NOTE: Starting cell is "D16"
Call Module2.algorithm(n, x_count)
If (x_count > 21) Then
Sheets("SUMMARY P.1").Activate
GoTo TooMany_Xs
End If
Next n
If (x_count > 5) Then 'Bring user back to last logged sheet
Sheets("SUMMARY P.2").Activate
Else
Sheets("SUMMARY P.1").Activate
End If
TooMany_Xs:
If Err.Number <> 0 Then
Msg = "you put more than 21 Items on the Summary Pages." & Chr(13) & _
"Consider editing your DSR or taking some other action."
MsgBox Msg, , "Error", Err.HelpFile, Err.HelpContext
End If
End Sub
End Sub通过选择数组中的所有工作表,您将对它们进行分组,并且您写入任何工作表中单元格的任何内容都将写入所有工作表 这就是罪魁祸首:
Sheets(Array("SUMMARY P.1", "SUMMARY P.2", "Process Control", _
"Electrical", "Environmental1", "Env.2 - Regulatory", "FIRE", _
"Human", "Industrial Hygiene", "Maintenance_Reliability", _
"Pressure_Vacuum", "Rotating & Mechanical", _
"Facility Siting & Security", "Process Safety Documentation", _
"Temperature-Reaction-Flow", "Valve-Piping", "Quality", _
"Product Stewardship", "4B ITEMS")).Select
即使您发布的代码尚未运行,您的问题也会发生,这让我觉得在您选择了所有工作表之后,还发生了其他一些事情
请注意,选择和激活是一个非常糟糕的主意。为要使用的对象声明变量,并以这种方式与它们交互,而不是选择它们
下面是一个快速示例,演示如何循环浏览工作簿中的所有工作表,并在不选择或激活的情况下对其进行修改。您可以修改代码以使用此模式:
Sub LoopThroughAllSheets()
Dim wb As Workbook
Dim ws As Worksheet
Set wb = ThisWorkbook
For Each ws In wb.Sheets
ws.Range("D15").Value = ws.Name
Next ws
End Sub
请阅读以下内容,开始编写更干净、更高效的VBA代码:
Worksheets("Whatever").Select
您还应该检查代码,以检查是否确实需要对工作表进行分组。因此,当我编写“Sheets”(“Electrical”).Activate”时,这与选择它不同?即使我为一张工作表写“.activate”,我仍然将所有其他工作表分组?没错。可以选择多张图纸,激活其中一张不会导致取消选择(取消分组)。如果您将多个工作表分组,请注意其中一个工作表名称比其他工作表名称更粗体,即
ActiveSheet
。这太棒了,我理解该代码,并且对我来说很有意义。唯一的问题是,如果我的起始范围值不总是单元格D15,那么如果我以这种方式使用for循环,我如何更改它?只是出于兴趣,如果我们在所有工作表中填充:worksheets.fillCrosssheets范围(“D15:E20”)
请确保正确的工作表处于活动状态。@user2608147,每张工作表中的起始范围通常由其中的数据决定,这些数据可能会随时间而变化。您可以在每张工作表中找到最后一行或最后一列,或需要查找的任何其他内容。如何确定要在每张工作表上使用的单元格?它是特定列中的最后一个单元格吗?列末尾的第一个空单元格?我只是要更改工作簿,使每张工作表从D15开始,并带有我感兴趣的列。但是,我该如何写循环,这样我就不会在每张纸上循环,比如说,在第3-18页(共20页)上循环
Sheets(Array("SUMMARY P.1", "SUMMARY P.2", "Process Control", _
"Electrical", "Environmental1", "Env.2 - Regulatory", "FIRE", _
...
"Product Stewardship", "4B ITEMS")).Select
Worksheets("Whatever").Select