2009-05-04 57 views
11

Sto appena iniziando a immergermi in VBA e ho colpito un po 'di un blocco stradale.Selezione di celle non vuote in Excel con VBA

Ho un foglio con oltre 50 colonne, oltre 900 righe di dati. Devo riformattare circa 10 di quelle colonne e incollarle in una nuova cartella di lavoro.

Come faccio a selezionare ogni cella non vuota in una colonna di book1, eseguirla attraverso alcune funzioni e rilasciare i risultati in book2?

+0

Quale programma stai usando: Excel o Access? Il titolo della tua domanda dice Excel, ma i tuoi tag dicono Access. –

+0

Definitivamente Excel, grazie per averlo indicato. Questo è il motivo per cui non si etichetta in fretta. –

risposta

5

Il seguente VBA co de dovrebbe iniziare. Copierà tutti i dati della cartella di lavoro originale in una nuova cartella di lavoro, ma avrà aggiunto 1 a ciascun valore e tutte le celle vuote saranno state ignorate.

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

Quando provo a eseguire questo codice, viene visualizzata una finestra di messaggio che dice "Oggetto richiesto". –

2

Se siete alla ricerca per l'ultima riga di una colonna, utilizzare:

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 

Altri comandi è necessario acquisire familiarità con sono di copia e incolla comandi:

Sub CopyOneToTwo() 
    SelectEntireColumn (1) 
    Selection.Copy 

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

Infine, può fare riferimento a fogli di lavoro in altre cartelle di lavoro utilizzando la seguente sintassi:

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

Questo potrebbe essere completamente fuori base, ma non puoi semplicemente copiare l'intera colonna in un nuovo foglio di calcolo e quindi ordinare la colonna? Suppongo che tu non abbia bisogno di mantenere l'integrità dell'ordine.

+2

Questo è completamente fuori base. –

14

So di essere Sono molto in ritardo su questo, ma qui alcuni esempi utili:

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

o

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

Per trovare l'ultima riga utilizzata nella colonna, mai fare affidamento su LastCell, che è inaffidabile (non viene ripristinato dopo l'eliminazione dei dati). Invece, io uso qualcosa come

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