2009-03-24 28 views
5

Desde un script VBS que tengo que trabajar con un libro de Excel con el formato:¿Cómo encuentro las filas de inicio y fin de las celdas combinadas en Excel con VBSCript?

|  A  |  B  |  C  | 
----|-----------|-----------|-----------| 
    1 | Header1 | Header2 | Header3 | 
----|-----------|-----------|-----------| 
    2 | FOLDER1 |   |   | 
----|-----------|-----------|-----------| 
    3 | Item1 | 111 | 222 | 
----|   |-----------|-----------| 
    4 |   | Item1Info | Item1Data | 
----|   |-----------|-----------| 
.. |   | ... | ... | 
----|   |-----------|-----------| 
11 |   | 333 | 444 | 
----|-----------|-----------|-----------| 
12 | Item2 | 555 | 666 | 
----|-----------|-----------|-----------| 
13 | FOLDER2 |   |   | 
----|-----------|-----------|-----------| 
14 | Item1 | 777 | 888 | 
----|-----------|-----------|-----------| 
.. | ... | ... | ... | 

Así: Columna A tiene nivel 1 y 2 categorías de nivel (Carpetas/Items), y las columnas B y C contener los datos para los artículos. El problema aquí es que un elemento puede abarcar varias filas, como se muestra; Item1 es una celda combinada de las filas 3 a 11).

Necesito crear un archivo .csv de estos datos que se ve de la siguiente manera:

Header1,Header2,Header3 
111,Item1,FOLDER1 
Item1Info,Item1,FOLDER1 
... 
555,Item2,FOLDER1 
777,Item1,FOLDER2 
... 

Los datos de la columna C se pueden descartar.

Básicamente, lo que necesito saber es cómo detectar si una celda se fusionó (es decir, más de una fila de información por elemento) y cuántas filas se fusionaron juntas. ¿Alguna idea?

Respuesta

10

Se puede utilizar:

if (Cell.MergeCells) Then ... 

para determinar si una célula es parte de una serie fusionada, y

Cell.MergeArea.Cells(1,1).value 

para acceder al valor que figura en ese intervalo combinado.

Aquí hay algunos ejemplos de código para comenzar. He omitido los detalles de escribir realmente el archivo CSV:

Public Sub MakeCSV() 
    Dim rowIndex As Integer 
    Dim itemColumn As Range 
    Dim dataColumn As Range 
    Dim itemCell As Range 
    Dim FolderName As String 
    Dim ItemName As String 
    Dim CSVLine As String 

    Set itemColumn = Range("A2:A100") 
    Set dataColumn = Range("B2:B100") 

    For rowIndex = 1 To dataColumn.Rows.Count 
     If dataColumn.Cells(rowIndex, 1).value = "" Then 
      Rem // determine the current folder name 
      FolderName = itemColumn.Cells(rowIndex, 1).value 
     Else 
      Rem // determine the item name (accounting for merged cells) 
      Set itemCell = itemColumn.Cells(rowIndex, 1) 
      If itemCell.MergeCells Then 
       ItemName = itemCell.MergeArea.Cells(1, 1).value 
      Else 
       ItemName = itemCell.value 
      End If 

      Rem // write a line to the CSV file 
      CSVLine = dataColumn.Cells(rowIndex, 1).value 
      CSVLine = CSVLine & "," & ItemName 
      CSVLine = CSVLine & "," & FolderName 
     End If 
    Next rowIndex 
End Sub 
0

Para probar si las células fusionadas cubren más de una fila:

cellRange = ExcelApplication.Cells(rowIndex, columnIndex)  
mergedColumns = cellRange.MergeArea.Rows.Count 
if mergedColumns > 1 then ' merged 
2

Gracias por sus respuestas. eJames Creo que ha respondido todo lo que quería saber, cómo detectar celdas combinadas y también la asignación de nombre de carpeta/nombre de elemento. Gracias de nuevo.

Puedo escribir los CSV sin ningún problema, se examina de cerca me di cuenta de que también las células FOLDERn fusionan columnas (AC) así que probablemente también se puede comprobar con el señor Lucky código:

mergedColumns = cellRange.MergeArea.Columns.Count 

Y si mergedColumns> 1 entonces es un nombre de carpeta.

Cuestiones relacionadas