2009-05-04 13 views
11

Je commence juste à plonger dans VBA et j'ai rencontré un peu de blocage.Sélection de cellules non-vides dans Excel avec VBA

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

Comment est-ce que je sélectionne par programme chaque cellule non-vide dans une colonne de book1, l'exécute par l'intermédiaire de certaines fonctions, et dépose les résultats dans book2?

+0

Quel programme utilisez-vous: Excel ou Access? Le titre de votre question indique Excel, mais vos tags disent Access. –

+0

Certainement Excel, merci d'avoir signalé cela. C'est pourquoi vous ne marquez pas rapidement. –

Répondre

5

de devrait vous aider à démarrer. Il va copier toutes les données dans le classeur d'origine vers 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 
+0

Lorsque j'essaie d'exécuter ce code, j'obtiens une boîte de message disant "Objet requis". –

2

Si vous recherchez la dernière rangée 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 

D'autres commandes que vous aurez besoin de se familiariser avec 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 peut référencer des feuilles de calcul dans d'autres classeurs en utilisant la syntaxe suivante:

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

Cela pourrait être complètement à côté, mais ne peut pas vous suffit de copier toute la colonne dans une nouvelle feuille de calcul, puis trier la colonne? Je suppose que vous n'avez pas besoin de maintenir l'intégrité de la commande.

+2

C'est complètement hors base. –

14

Je sais que je suis suis très en retard à ce sujet, mais voici quelques échantillons 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, jamais compter sur LastCell, ce qui n'est pas fiable (il n'est pas réinitialisé après la suppression des données). Au lieu de cela, j'utilise quelque chose comme

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