Макросът за копиране и поставяне предизвиква функционалност на „групиран“ работен лист?

Получавам грешка, която не мога да разбера:

След като стартирам макроса по-долу, две определени стойности на низ се поставят в едни и същи две клетки във ВСИЧКИ листове, въпреки че съм сигурен, че листовете не са групирани или не съдържат индивидуален собствен код. По-конкретно, елементите „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

След това този макрос се намира в Module2:

Sub algorithm(n As Long, x_count As Long)

        'If an "x" or "X" is marked in the "Yes" column,
        'at descending cells down the column offset by the for loop index, n

        If (ActiveCell.Offset(n, 0) = "x" Or ActiveCell.Offset(n, 0) = "X") Then

            item_a = ActiveCell.Offset(n, -3).Value     ' Store Letter value
            item_a = Replace(item_a, "(", "")           ' Get rid of "(", ")", and " " (space)
            item_a = Replace(item_a, ")", "")           ' characters that are grabbed
            item_a = Replace(item_a, " ", "")

            item_b = ActiveCell.Offset(n, -2).Value     ' Store number value
            item_b = Replace(item_b, "(", "")           ' Get rid of "(", ")", and " " (space)
            item_b = Replace(item_b, ")", "")           ' characters that are grabbed
            item_b = Replace(item_b, " ", "")

            x_count = x_count + 1                       ' increment the total x count

            If (x_count > 5) Then                       ' If there are more than 5 "x" marks,

                Sheets("SUMMARY P.2").Activate          ' then continue to log in SUMMARY P.2
                Range("A18").Select                     ' Choose "Item" column, first cell
                ActiveCell.Offset((x_count - 6), 0).Value = (item_a & item_b)

                'Insert cocatenated value of item_a and item_b
                '(for example "A" & "1" = "A1")
                'at the cells under the "Item" column, indexed by x_count

            Else                                        ' If there are less than 5 "x" marks,

                Sheets("SUMMARY P.1").Activate          ' log in SUMMARY P.1
                Range("A25").Select
                ActiveCell.Offset((x_count - 1), 0).Value = (item_a & item_b)

            End If

        End If

End Sub


person user2608147    schedule 29.07.2013    source източник


Отговори (2)


Като изберете всички листове във вашия масив, вие ги групирате и всичко, което напишете в клетка в който и да е лист, ще бъде записано във всички листове.

Това е виновникът:

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 код:

person Jon Crowell    schedule 29.07.2013
comment
Това е брилянтно, разбирам този код и има смисъл за мен. Единственото нещо е, че ако стойността на началния ми диапазон не винаги е клетка D15, как мога да променя това, ако използвам for цикъл по този начин? - person user2608147; 29.07.2013
comment
Просто от интерес, ако попълваме ВСИЧКИ работни листове: Worksheets.FillAcrossSheets Range("D15:E20") просто се уверете, че правилният лист е Активен. - person Andy G; 30.07.2013
comment
@user2608147, началният диапазон във всеки лист обикновено ще бъде продиктуван от данните, които са в него, които вероятно ще варират с времето. Можете да намерите последния ред или последната колона или каквото друго трябва във всеки лист. - person Jon Crowell; 30.07.2013
comment
Как определяте с коя клетка искате да работите на всеки лист? Това ли е последната клетка в определена колона? Първата празна клетка в края на колона? - person Jon Crowell; 30.07.2013
comment
Просто ще сменя работната книга, така че всеки лист да започва от D15 с тази колона, която ме интересува. Но как да напиша този цикъл for, така че да не преминавам през всеки лист, а да речем листове 3-18 ( от 20) - person user2608147; 30.07.2013

Sheets(Array("SUMMARY P.1", "SUMMARY P.2", "Process Control", _
   "Electrical", "Environmental1", "Env.2 - Regulatory", "FIRE", _
   ...
"Product Stewardship", "4B ITEMS")).Select

групира всички тези работни листове. В даден момент трябва да ги разгрупирате, като изберете един работен лист:

Worksheets("Whatever").Select

Трябва също да прегледате кода си, за да проверите дали групирането на работните листове действително е необходимо.

person Andy G    schedule 29.07.2013
comment
така че, когато напиша „Лишави (електрически).Активиране“, това не е същото като да го избера? Все още имам групирани всички други листове, дори ако напиша „.activate“ за един лист? - person user2608147; 29.07.2013
comment
Това е вярно. Няколко листа могат да бъдат избрани и активирането на един от тях няма да доведе до премахване на избора им (негрупиране). Ако групирате няколко листа, забележете, че едно от имената на листа е по-удебелено от останалите - това е ActiveSheet. - person Andy G; 29.07.2013