Как определить границы склеенных ячеек в Excel листе, используя EPPlus?
Дано:
На листе имеется 15 колонок, известно что в 5-той колонке имеются склеенные по вертикали ячейки.
Используя библиотеку EPPlus, пытаюсь получить информацию о том, какие ячейки склеены, но добираясь до ячейки у которой is_merge=True я вижу в cell.Start.Address и cell.End.Address одно и тоже.
Dim columns As Integer = 0
Using package As New ExcelPackage(xlsx_file)
Dim worksheet As ExcelWorksheet = package.Workbook.Worksheets(1)
columns = worksheet.Dimension.Columns
Dim rows As Integer = worksheet.Dimension.Rows
For row = 1 To rows
Dim is_merge As Boolean = worksheet.Cells(row, 5).Merge
If is_merge = True Then
Dim value As Object = worksheet.Cells(row, 5).Value
Dim cell As ExcelRange = worksheet.Cells(row, 5)
Dim start = cell.Start.Address
Dim [end] = cell.End.Address
Stop
End If
Next
End Using
Ответы (1 шт):
Переменной cell присвоена одна ячейка - Cells(row, 5), но не диапазон сцепленых ячеек, поэтому и адрес одинаковый.
В примерах ниже - сцепление в столбце. И второе примечание - в примерах смесь VBA и того, что в коде автора (надеюсь, там тоже есть операторы Offset, MergeArea... или аналогичные) :). Разберетесь.
Находим адрес последней ячейки в сцепленном диапазоне.
Вариант 1. Находим количество ячеек i в сцепленном диапазоне и смещаем фокус на i - 1. Но смещение в этом же столбце
Cells(row, 5).Offset(i - 1, 0).Address
получится от последней ячейки сцепленного диапазона, поэтому смещение применяем к ячейке соседнего (или любого другого) столбца:
i = Cells(row, 5).MergeArea.Cells.Count
Dim [end] = Cells(row, 4).Offset(i - 1, 1).Address
И все бы ничего, но если ячейка, на которую идет ссылка, тоже объединена с другими, будет ошибка определения адреса.
Вариант 2 лишен этого недостатка. Находим первую ячейку после сцепленных, потом смещаем ее вверх на одну строку:
Dim temp As ExcelRange = worksheet.Cells(row, 5).Offset(1, 0)
Dim [end] = temp.Offset(-1,0).Address
Вариант 3. Без смещения. Определяем количество ячеек в сцепленном диапазоне и добавляем его к ссылке на строку:
i = Cells(row, 5).MergeArea.Cells.Count
Dim cellEnd As ExcelRange = worksheet.Cells(row + i - 1, 5)
Dim [end] = cellEnd.Address