5

From a VBS script I have to work with an Excel book with the format:

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

So: Column A has 1st level and 2nd level categories (Folders/Items), and Columns B and C hold the data for the items. The trouble here is that one item can span several rows, as shown; Item1 is a merged cell from rows 3 to 11).

I need to create a .csv from this data that looks as follows:

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

The data in Column C can be discarded.

Basically, what I need to know is how to detect if a cell is merged (that is; more than one row of information per item) and how many rows are merged together. Any idea?

4

3 回答 3

10

您可以使用:

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
于 2009-03-24T19:00:31.967 回答
2

感谢您的回复。eJames 我想你已经回答了我想知道的一切,如何检测合并的单元格以及 FolderName / ItemName 分配。再次感谢。

我可以毫无问题地编写 CSV,经过仔细检查,我注意到 FOLDERn 单元格也合并了列(AC),所以我可能也可以检查 Mister Lucky 代码:

mergedColumns = cellRange.MergeArea.Columns.Count

如果 mergeColumns > 1 那么它是一个文件夹名称。

于 2009-03-25T07:40:09.580 回答
0

要测试合并的单元格是否覆盖多于一行:

cellRange = ExcelApplication.Cells(rowIndex, columnIndex)    
mergedColumns = cellRange.MergeArea.Rows.Count
if mergedColumns > 1 then ' merged
于 2009-03-24T19:29:38.743 回答