Как найти начальную и конечную строки объединенных ячеек в Excel с VBSCript? - PullRequest
5 голосов
/ 24 марта 2009

Из сценария VBS мне нужно работать с книгой Excel в формате:

    |     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    |
----|-----------|-----------|-----------|
 .. |    ...    |    ...    |    ...    |

Итак: столбец A имеет категории 1-го уровня и 2-го уровня (папки / элементы), а столбцы B и C содержат данные для элементов. Проблема здесь в том, что один элемент может занимать несколько строк, как показано; Item1 - это объединенная ячейка из строк с 3 по 11).

Мне нужно создать .csv из этих данных, который выглядит следующим образом:

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

Данные в столбце C могут быть отброшены.

По сути, мне нужно знать, как определить, объединена ли ячейка (т. Е. Более одной строки информации на элемент). и , сколько строк объединено вместе. Есть идеи?

Ответы [ 3 ]

10 голосов
/ 24 марта 2009

Вы можете использовать:

if (Cell.MergeCells) Then ...

для определения, является ли ячейка частью объединенного диапазона, и

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

для доступа к значению, содержащемуся в этом объединенном диапазоне.

Вот пример кода, с которого можно начать. Я опустил детали фактического написания файла 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
2 голосов
/ 25 марта 2009

Спасибо за ваши ответы. eJames Я думаю, что вы ответили на все, что я хотел знать, как обнаружить объединенные ячейки, а также назначение FolderName / ItemName. Еще раз спасибо.

Я могу написать CSV без проблем, при ближайшем рассмотрении я заметил, что также ячейки FOLDERn объединяют столбцы (A-C), поэтому, вероятно, я также могу проверить с помощью кода Mister Lucky:

mergedColumns = cellRange.MergeArea.Columns.Count

А если mergedColumns> 1, то это имя папки.

0 голосов
/ 24 марта 2009

Чтобы проверить, покрывают ли объединенные ячейки более одной строки:

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