如何使用VBSCript在Excel中查找合并单元格的开始和结束行?

时间:2009-03-24 17:47:47

标签: excel vbscript merge range

从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 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

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

我可以毫无问题地编写CSV,仔细观察后我注意到FOLDERn单元格合并列(A-C)所以我可以查看Mister Lucky代码:

mergedColumns = cellRange.MergeArea.Columns.Count

如果mergedColumns> 1然后它是一个文件夹名称。

答案 2 :(得分:0)

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

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