简体   繁体   中英

VBA not updating Excel rows referring to other sheets in same workbook when sorting rows alphabetically

I'm having problems, Excel is not updating rows referring to other sheets in same workbook when ordering rows alphabetically.

I have a userform in which there's a button insertCM with this code:

Private Sub insertButton_Click()

    ActiveCell.EntireRow.Select
    Selection.Insert Shift:=xltoDown

    Range("A9:AK9").Copy
    Range("A8:AK8").Select
    Selection.PasteSpecial Paste:=xlPasteFormulas
    Selection.PasteSpecial Paste:=xlPasteFormats

    Range("C10").Copy
    Range("C8:C9").Select
    Selection.PasteSpecial Paste:=xlPasteFormulas

    Range("H9:AK9").Copy
    Range("H8:AK8").Select
    Selection.PasteSpecial Paste:=xlPasteAll

    nomCM = Empty
    CXinitial = Empty
    resteCX = Empty
    CCselect = Empty
    C4initial = Empty
    resteC4 = Empty
    compteurCT = Empty

    Range("A8").Activate
    ActiveCell.RowHeight = 18.6

    For i = 2 To ThisWorkbook.Sheets.Count

        With Sheets(i).Select

            emptyRow = Range("A9").End(xlDown).Offset(0, 2).Row
            Range("A9:AL" & emptyRow).Sort _
                Key1:=Range("A9"), Order1:=xlAscending

            Set SearchRange = Range("A8", Range("A200").End(xlUp))
            Set FindRow = SearchRange.Find(nomCM, LookIn:=xlValues, LookAt:=xlWhole)
            Range("A" & FindRow.Row).Select
            ActiveCell.EntireRow.Activate

        End With

    Next i

    Sheet2.Select

    End
End Sub

The userform is used for inserting new clients in several sheets at the same time. Textbox inserts Name, Cost Center, etc., in a blank row and insertButton inserts a new row leaving data inserted in row 8 to go to row 9 . After that the code puts all rows alphabetical order so the new client now in row 9 goes to the new one, and cells containing formulas change row numbers.

However some of the sheets have cells containing references to other sheets' cells in the same row. So imagine:

I insert client name "LORUM" "Cost Center 4" and it puts him in row 9 so formula is:

=$C9-COUNTIF($E9:$P9;"CT")+'Sheet5'!$D9

...but when it changes his row to the final one, formula row is:

=$C18-COUNTIF($E18:$P18;"CT")+'Sheet5'!$D9

It does not change row when referring to other sheets.

Any ideas?

It's looks like you've made a good effort, but there are still numerous problems with your code (beside the one line), and I can guarantee that a combination of these issues are preventing your intended outcome.

I can't fix it completely because there are so many bugs that I'm not clear on what you're trying to do, but hopefully this will get you started on the right track...

  • xlToDown is not a valid reference. You probably mean xlDown

  • you have a number of undeclared variables and objects, like: i, emptyRow, SearchRange, FindRow, nomCM

  • you have things (objects?) "set to nothing" that aren't declared or used anywhere: CXinitial, resteCX, CCselect, C4initial, resteC4, compteurCT

  • your Find statement is looking for nomCM which is empty (and never set), so the Find statement will never find anything.

  • You should put Option Explicit at the top of every module (especially when learning or troubleshooting). This will prevent issues like the ones above by "forcing" you to properly declare & handle all of your variables, objects, properties, etc.

  • Near the end, you refer to Sheet2.Select as if Sheet2 is a declared object , instead of using Sheets("Sheet2").Select . I'm not sure why you're selecting the sheet at the very end anyhow.

  • You have an With..End statement that is doing absolutely nothing since you don't reference it with a . dot anywhere: With Sheets(i).Select .. End With , and also Select isn't used like that.

  • A mystery End near the end for some reason.

Also, you're unnecessarily doubling up commands like:

ActiveCell.EntireRow.Select
Selection.Insert Shift:=xlDown

..instead of:

ActiveCell.EntireRow.Insert Shift:=xlDown

and another example, all this:

Range("A9:AK9").Copy
Range("A8:AK8").Select
Selection.PasteSpecial Paste:=xlPasteFormulas
Selection.PasteSpecial Paste:=xlPasteFormats

Range("C10").Copy
Range("C8:C9").Select
Selection.PasteSpecial Paste:=xlPasteFormulas

Range("H9:AK9").Copy
Range("H8:AK8").Select
Selection.PasteSpecial Paste:=xlPasteAll

...instead of:

Range("A9:AK9").Copy
Range("A8:AK8").PasteSpecial xlPasteValuesAndNumberFormats

Range("C10").Copy
Range("C8:C9").PasteSpecial Paste:=xlPasteFormulas

Range("H9:AK9").Copy Range("H8:AK8")

All of this would be more clear by Googling the documentation for each command you're unfamiliar with, such as:

All the ActiveCell and ThisWorkbook references are troublesome but again, I'm not sure what to do with them since I don't know your workbook.

Indentation (and general organization) are very important as well. It may not change the way that the code runs, but it will help you (and others) track down existing & potential issues more easily.


Here is your code cleaned up as best as I could:

Option Explicit 'this line goes at the very top of the module


Private Sub insertButton_Click()

    Dim i As Long, emptyRow As Long, SearchRange As Range, FindRow As Range, nomCM

    nomCM = Empty

    ActiveCell.EntireRow.Insert Shift:=xlDown

    Range("A9:AK9").Copy
    Range("A8:AK8").PasteSpecial xlPasteValuesAndNumberFormats

    Range("C10").Copy
    Range("C8:C9").PasteSpecial Paste:=xlPasteFormulas

    Range("H9:AK9").Copy Range("H8:AK8")
    Range("A8").RowHeight = 18.6

    For i = 2 To ThisWorkbook.Sheets.Count

        With Sheets(i)
            emptyRow = .Range("A9").End(xlDown).Offset(0, 2).Row
            .Range("A9:AL" & emptyRow).Sort Key1:=.Range("A9"), Order1:=xlAscending

            Set SearchRange = .Range("A8", .Range("A200").End(xlUp))
            Set FindRow = SearchRange.Find(nomCM, LookIn:=xlValues, LookAt:=xlWhole)
            .Range("A" & FindRow.Row).Select
            ActiveCell.EntireRow.Activate
        End With

    Next i

    Sheets("Sheet2").Select

End Sub

as per my test, sorting actually doesn't change other sheet direct references

so you may want to use OFFSET to keep referencing the actual current row index

instead of:

=$C9-COUNTIF($E9:$P9;"CT")+'Sheet5'!$D9

use

=$C9-COUNTIF($E9:$P9;"CT")+ OFFSET('Sheet5'!$D1,ROW()-1,0)

I found a solution:

=INDIRECT(ADDRESS(ROW();4;3;1;"Sheet5"))

Where Row() will always refer to the actual cell's row.

Hope it will help you!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM