2009-05-04 29 views
11

Estoy empezando a sumergirme en VBA y he topado con un obstáculo.Seleccionar celdas no en blanco en Excel con VBA

Tengo una hoja con más de 50 columnas, más de 900 filas de datos. Necesito volver a formatear alrededor de 10 de esas columnas y pegarlas en un nuevo libro de trabajo.

¿Cómo selecciono programáticamente cada celda que no esté en blanco en una columna de book1, la ejecuto a través de algunas funciones y dejo caer los resultados en book2?

+0

¿Qué programa estás usando: Excel o Access? El título de su pregunta dice Excel, pero sus etiquetas dicen Acceso. –

+0

Definitivamente Excel, gracias por señalarlo. Esta es la razón por la que no etiquetar con prisa. –

Respuesta

5

La siguiente VBA co de debería comenzar. Copiará todos los datos en el libro de trabajo original a un nuevo libro de trabajo, pero habrá agregado 1 a cada valor, y todas las celdas en blanco se habrán ignorado.

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

Cuando intento ejecutar este código, aparece un mensaje que dice "Se requiere un objeto". –

2

Si usted está buscando la última fila de una columna, utilice:

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 

Otros comandos que tendrá que familiarizarse con son de copiar y pegar comandos:

Sub CopyOneToTwo() 
    SelectEntireColumn (1) 
    Selection.Copy 

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

Por último, puede hacer referencia a hojas de trabajo en otros libros utilizando la siguiente sintaxis:

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

Esto podría ser completamente fuera de la base, pero no puede usted acaba de copiar toda la columna en una nueva hoja de cálculo y luego ordenar la columna? Supongo que no necesita mantener la integridad del pedido.

+2

Eso está completamente fuera de base. –

14

Sé que soy soy muy tarde en esto, pero aquí algunas muestras Utiles:

'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 

para encontrar la última fila utilizada en la columna, no se basan en LastCell, que no es confiable (no se restablece después de eliminar datos). En cambio, uso algo como

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