Question

Je commence tout juste à plonger dans VBA et je me suis heurté à un obstacle.

J'ai une feuille avec plus de 50 colonnes, plus de 900 lignes de données. Je dois reformater environ 10 de ces colonnes et les coller dans un nouveau classeur.

Comment sélectionner par programme toutes les cellules non vides d'une colonne de book1, l'exécuter à travers certaines fonctions et supprimer les résultats dans book2?

Était-ce utile?

La solution

Le code VBA suivant devrait vous aider à démarrer. Il copiera toutes les données du classeur d'origine dans un nouveau classeur, mais il aura ajouté 1 à chaque valeur et toutes les cellules vides auront été ignorées.

Option Explicit

Public Sub exportDataToNewBook()
    Dim rowIndex As Integer
    Dim colIndex As Integer
    Dim dataRange As Range
    Dim thisBook As Workbook
    Dim newBook As Workbook
    Dim newRow As Integer
    Dim temp

    '// set your data range here
    Set dataRange = Sheet1.Range("A1:B100")

    '// create a new workbook
    Set newBook = Excel.Workbooks.Add

    '// loop through the data in book1, one column at a time
    For colIndex = 1 To dataRange.Columns.Count
        newRow = 0
        For rowIndex = 1 To dataRange.Rows.Count
            With dataRange.Cells(rowIndex, colIndex)

            '// ignore empty cells
            If .value <> "" Then
                newRow = newRow + 1
                temp = doSomethingWith(.value)
                newBook.ActiveSheet.Cells(newRow, colIndex).value = temp
                End If

            End With
        Next rowIndex
    Next colIndex
End Sub


Private Function doSomethingWith(aValue)

    '// This is where you would compute a different value
    '// for use in the new workbook
    '// In this example, I simply add one to it.
    aValue = aValue + 1

    doSomethingWith = aValue
End Function

Autres conseils

Je sais que je suis très en retard, mais voici quelques exemples utiles:

'select the used cells in column 3 of worksheet wks
wks.columns(3).SpecialCells(xlCellTypeConstants).Select

ou

'change all formulas in col 3 to values
with sheet1.columns(3).SpecialCells(xlCellTypeFormulas)
    .value = .value
end with

Pour trouver la dernière ligne utilisée dans la colonne, ne vous fiez jamais à LastCell, qui n’est pas fiable (elle n’est pas réinitialisée après la suppression des données). Au lieu de cela, j'utilise quelque chose comme

 lngLast = cells(rows.count,3).end(xlUp).row

Si vous recherchez la dernière ligne d'une colonne, utilisez:

Sub SelectFirstColumn()
   SelectEntireColumn (1)
End Sub

Sub SelectSecondColumn()
    SelectEntireColumn (2)
End Sub

Sub SelectEntireColumn(columnNumber)
    Dim LastRow
    Sheets("sheet1").Select
    LastRow = ActiveSheet.Columns(columnNumber).SpecialCells(xlLastCell).Row

    ActiveSheet.Range(Cells(1, columnNumber), Cells(LastRow, columnNumber)).Select
End Sub

Les autres commandes avec lesquelles vous devrez vous familiariser sont les commandes copier et coller:

Sub CopyOneToTwo()
    SelectEntireColumn (1)
    Selection.Copy

    Sheets("sheet1").Select
    ActiveSheet.Range("B1").PasteSpecial Paste:=xlPasteValues
End Sub

Enfin, vous pouvez référencer des feuilles de calcul dans d'autres classeurs à l'aide de la syntaxe suivante:

Dim book2
Set book2 = Workbooks.Open("C:\book2.xls")
book2.Worksheets("sheet1")

Il se peut que cela soit complètement faux, mais vous ne pouvez pas simplement copier la colonne entière dans une nouvelle feuille de calcul, puis trier la colonne? Je suppose que vous n'avez pas besoin de maintenir l'intégrité de l'ordre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top