Comportement inattendu de "Pour Chacune des semaines De la ActiveWindow.SelectedSheets", elle affecte plus de la colonne qu'il devrait être

0

La question

je n'ai ce code qui fonctionne assez bien sauf la dernière partie:

Le comportement de la dernière partie doit être ".L'intérieur.La couleur" et ".Valeur" affectée jusqu'à la dernière peuplée de la colonne, au lieu qu'il affecte la première cellule de beaucoup d'autres colonnes. Des idées?

  Sub Sample_Workbook()
        
        'Creation of new workbook
        Application.ScreenUpdating = False        
        Workbooks.Add
        
        Set wb = ActiveWorkbook
        wb.SaveAs ThisWorkbook.Path & "etc.xlsx"
        
        'following variable is declared for sending mail purpose
        SourceWorkbook = ActiveWorkbook.Name
        
        Set this = Workbooks("Sample")
        Set wb = ActiveWorkbook
        Set ws1 = wb.Sheets("Sheet1")
        wb.Sheets.Add After:=Sheets(1)
        Set ws2 = wb.Sheets(2)
        wb.Sheets.Add After:=Sheets(2)
        Set ws3 = wb.Sheets(3)
        ws1.Name = "Sheet1"
        ws2.Name = "Sheet2"
        ws3.Name = "Sheet3"
        
        
        'Model the new excel with the requirements:
        Dim Population, Population2 As Range
        Dim lastRow As Long, firstRow As Long
        Dim sampleSize As Long
        Dim unique As Boolean
        Dim i As Long, d As Long, n As Long
        
        
        'following function perfoms all the calculations and copy and pasting        
            
            doTheJob x, y, z, num, q           
            doTheJob x, y, z, num, q 
            doTheJob x, y, z, num, q 
                
        'copy and paste the remaining sheets from the sample files
            Workbooks.Open ThisWorkbook.Path & "Sample2.xlsx"
                Sheets("Sheetx").Copy After:= _
                 Workbooks(SourceWorkbook).Sheets(6)
            Workbooks("Sample2.xlsx").Close SaveChanges:=False
        
        Application.ScreenUpdating = True
        Application.CutCopyMode = False
        ws1.Select
        wb.Close SaveChanges:=True
        End Sub

'these will make the variable available to all modules of this macro Workbook
Public SourceWorkbook As String
Public this, wb As Workbook
Public data As Range
Public output As Range
Public ws1, ws2, ws3 As Worksheet
Public LastCol As Long
Public wks As Worksheet
Public iCol As Long




'FUNCTION
Sub doTheJob(x As String, y As String, z As String, num As Integer, q As String)

    'beginning logic.
    this.Worksheets(x).Activate

Set Population = Range("a3", Range("a3").End(xlDown))
    sampleSize = this.Worksheets("SNOW Reports").Range(y).Value

Set r = Population
    lastRow = r.Rows.Count + r.Row - 1
    firstRow = r.Row


    For i = 1 To sampleSize
   Do
   
    unique = True
    n = Application.WorksheetFunction.RandBetween(firstRow, lastRow)
    
        For d = 1 To i - 1
        'wb.Sheets(z).Activate
        
          If wb.Sheets(z).Cells(d + 1, 50) = n Then
            unique = False
            Exit For
            End If
        Next d
        
          If unique = True Then
          Exit Do
          End If
        
    Loop
    
    Set data = this.Worksheets(x).Range("a" & n, Range("a" & n).End(xlToRight))
    Set output = wb.Worksheets(z).Range("A" & i + 1)
     
    output.Resize(data.Rows.Count, data.Columns.Count).Value = data.Value
        'THE NEXT LINE IS JUST FOR DELETEING LAST COLUMN PURPOSE
    wb.Worksheets(z).Cells(1, 50) = "REF COL"
    wb.Worksheets(z).Cells(i + 1, 50) = n
    
 this.Worksheets(x).Activate
    
Next i

    'delete REF COL:
       With wb.Sheets(z)
            .Columns(50).Delete
        End With
    
    'copy and paste header:
    Set data = this.Worksheets(x).Range("a2", Range("a2").End(xlToRight))
    Set output = wb.Sheets(z).Range("A1")
    
    output.Resize(data.Rows.Count, data.Columns.Count).Value = data.Value
     
'_________________________________________________________________________________________________________

'copy and paste into new sheet with recorded macro
    
   wb.Activate
   Sheets.Add(After:=Sheets(num)).Name = q
   wb.Worksheets(z).Cells.Copy Destination:=wb.Worksheets(q).Range("A1")
             
    'create columns and add color and text dinamically
    For Each wks In ActiveWindow.SelectedSheets
        With wks
            For iCol = .Cells.SpecialCells(xlCellTypeLastCell).Column To 2 Step -1
                .Columns(iCol).Insert
                With Cells(1, iCol)
                .Interior.Color = 65535
                .Value = Cells(1, iCol - 1) & " - Comparison"
                End With
            Next iCol
        End With
    Next wks

End Sub
excel foreach vba
2021-11-23 21:01:44
1

La meilleure réponse

0

Si je comprends bien ce que vous visez à faire, la suivante est-ce que vous voulez.

  • Le code pourrait être abordé de manière différente (et, éventuellement, de le rendre plus efficace), si le contexte plus large a été connu
  • Cependant, je sens que c'est juste une étape de votre développement, de façon à avoir séjourné avec votre approche (dans la mesure du raisonnable).
' I suggest this goes to the top of the sub (no need for public declaration)
' Note the shorthand declaration: 'lgRow&' is the same as `lgRow as Long'
    Dim lgRow&, lgCol&, lgLastRow&
             

' Replaces the code starting with the next comment 
    'create columns and add color and text dynamically
    For Each wks In ActiveWindow.SelectedSheets
        With wks
            For lgCol = .Cells.SpecialCells(xlCellTypeLastCell).Column To 2 Step -1
                
                ' Insert a column (not sure why you're not doing this after the last column also)
                .Columns(lgCol).Insert
                
                ' Get last row with data in the column 1 to the left
                With .Columns(lgCol - 1)
                    lgLastRow = .Cells(.Cells.Count).End(xlUp).Row
                End With
                    
                ' In the inserted column:
                ' o Set cell color
                ' o Set value to corresponding cell to the left, appending ' - Comparison'
                For lgRow = 1 To lgLastRow
                    With .Cells(lgRow, lgCol)
                        .Interior.Color = 65535
                        .Value = .Offset(0, -1) & " - Comparison"
                    End With
                Next lgRow
            Next lgCol
        End With
    Next wks

Note 1: Pas sûr de la raison, mais votre code insère la comparaison des colonnes après chaque colonne, à l'exception de la dernière colonne (de la copie de données). Si je comprends votre intention correctement, je suppose que vous voulez le faire pour la dernière colonne. Si c'est vrai:

'change this line
    For lgCol = .Cells.SpecialCells(xlCellTypeLastCell).Column To 2 Step -1
'To:
    For lgCol = .Cells.SpecialCells(xlCellTypeLastCell).Column + 1 To 2 Step -1

Note 2: Mes changements de code à écrire <cell value> & " - Comparison" pour toutes les cellules de chaque colonne, jusqu'à la dernière non vide de cellules dans chaque 'par rapport' colonne (y compris les cellules vides au-dessus de cela). Si vous voulez faire que d'écrire pour toutes les lignes du copié de la plage de données (si les cellules sont vides ou non), vous pouvez simplifier le code en plaçant les éléments suivants:

' Insert this:
    lgLastRow = .Cells.SpecialCells(xlCellTypeLastCell).Row
'above line:
    For lgCol = ....

Et de supprimer ce:

    ' Get last row with data in the column 1 to the left
    With .Columns(iCol - 1)
        lgLastRow = .Cells(.Cells.Count).End(xlUp).Row
    End With

Autre Remarque / Pointeurs:

  1. Recommander Option Explicit au-dessus de tous les modules (seulement permet d'économiser beaucoup de débogage en raison de fautes de frappe)
  2. Il n'y a pas besoin (et ce n'est pas une bonne pratique) à déclarer Public les variables qui ne sont utilisées que localement dans un Sub ou Function. Au lieu de cela, déclarer, même localement (généralement en haut de la Sub ou Function).
  3. C'est une bonne pratique d'utiliser les principaux caractères des noms de variable IDENTIFIANT le type de données. Peut être n'importe quelle longueur, mais est généralement de 1, 2 ou 3 caractères (codeur de préférence). par exemple ci-Dessus j'ai utilisé lg pour l'ID de types de données long. De même, j'utilise in pour Integer, st pour String, rg pour Range, etc.
2021-11-24 07:52:25

Je ne suis pas sûr de la façon largement utilisé la notation hongroise est actuellement, et il y a toujours un débat quant à savoir si elle était ou non une bonne chose. Je veux dire, il peut être utile, juste de l'OMI au détriment de la lisibilité (et certains brièveté qui est secondaire).
Chris Strickland

Re 3) Ce que vous êtes en préconisant voici systèmes "à la hongroise", qui est largement discrédité. D'autre part, les "Apps hongrois" peut être utile. Une bonne lecture (et non sur vba, mais toujours pertinents)
chris neilsen

@Chris Strickland: d'Accord il y a des pour et des contre. Dans les langues où le type de données est implicite (par rapport explicite), j'opte pour but de nommage. Dans des langues (comme vba) où il est explicite, je m'en tiens à la "éprouvées" comme je trouve qu'il rend le débogage plus facile.
Spinner

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................