Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.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 复制粘贴宏正在引导';分组'-工作表功能?_Excel_For Loop_Grouping_Copy Paste_Vba - Fatal编程技术网

Excel 复制粘贴宏正在引导';分组'-工作表功能?

Excel 复制粘贴宏正在引导';分组'-工作表功能?,excel,for-loop,grouping,copy-paste,vba,Excel,For Loop,Grouping,Copy Paste,Vba,我遇到了一个我无法理解的错误: 在我运行下面的宏之后,两个特定的字符串值被粘贴到所有工作表中相同的两个单元格中,尽管我确信工作表没有分组或不包含各自的代码。具体而言,项目“B12”和“B25”粘贴在同一单元格(A29和A30)的所有页面上(参见代码)。“B12”和“B25”与单元格位置无关,只是我的应用程序特有的标识符。它们是从一张图纸复制并粘贴到另一张图纸上的值。如果代码中存在复制+粘贴错误,那么我希望所有项目都有相同的错误,因为每个工作表都会调用“算法”子例程 有时,在不执行宏的情况下也会发

我遇到了一个我无法理解的错误:

在我运行下面的宏之后,两个特定的字符串值被粘贴到所有工作表中相同的两个单元格中,尽管我确信工作表没有分组或不包含各自的代码。具体而言,项目“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