Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 delphi ole excel findformat mergecells  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 47506
Надо вызвать в delphi через ole excel и настроить findformat на mergecells

в экселе это выглядит вот так
 Application.FindFormat.MergeCells = True


в делфи по-простому не взлетело
ExcelApp.FindFormat.MergeCells := True; -- не компилится; да и не должно, там целая структура для FindFormat
+
// *********************************************************************//
// DispIntf:  CellFormat
// Flags:     (4096) Dispatchable
// GUID:      {00024450-0000-0000-C000-000000000046}
// *********************************************************************//
  CellFormat = dispinterface
    ['{00024450-0000-0000-C000-000000000046}']
    property Application: ExcelApplication readonly dispid 148;
    property Creator: XlCreator readonly dispid 149;
    property Parent: IDispatch readonly dispid 150;
    property Borders: Borders dispid 435;
    property Font: Font dispid 146;
    property Interior: Interior dispid 129;
    property NumberFormat: OleVariant dispid 193;
    property NumberFormatLocal: OleVariant dispid 1097;
    property AddIndent: OleVariant dispid 1063;
    property IndentLevel: OleVariant dispid 201;
    property HorizontalAlignment: OleVariant dispid 136;
    property VerticalAlignment: OleVariant dispid 137;
    property Orientation: OleVariant dispid 134;
    property ShrinkToFit: OleVariant dispid 209;
    property WrapText: OleVariant dispid 276;
    property Locked: OleVariant dispid 269;
    property FormulaHidden: OleVariant dispid 262;
    property MergeCells: OleVariant dispid 208;
    procedure Clear; dispid 111;
  end;


Цель всего этого:
надо найти, есть ли в выбранном диапазоне объединенные ячейки. Если есть - то может глючить загрузка ячеек в массив через Ole
ExcelObject.Range[sh.Cells[FirstRow, FirstCol], sh.Cells[FirstRow + RowCount-1, FirstCol+ColCount-1]].select;


перебором по каждой ячейке искать медленно
хотел побыстрее, поиском



В общем, если идеи есть, прошу помощи
25 июн 18, 19:30    [21519687]     Ответить | Цитировать Сообщить модератору
 Re: delphi ole excel findformat mergecells  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 47506
версия - д7
25 июн 18, 19:30    [21519689]     Ответить | Цитировать Сообщить модератору
 Re: delphi ole excel findformat mergecells  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10410
andreymx
не компилится; да и не должно,
Вообще-то должно. Не компилится с какой ошибкой? Какие типы у ExcelApp и FindFormat?
25 июн 18, 22:22    [21520059]     Ответить | Цитировать Сообщить модератору
 Re: delphi ole excel findformat mergecells  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 47506
    property FindFormat: CellFormat read Get_FindFormat write _Set_FindFormat;


    procedure _Set_FindFormat(const RHS: CellFormat);

// *********************************************************************//
// DispIntf:  CellFormat
// Flags:     (4096) Dispatchable
// GUID:      {00024450-0000-0000-C000-000000000046}
// *********************************************************************//
  CellFormat = dispinterface
    ['{00024450-0000-0000-C000-000000000046}']
    property Application: ExcelApplication readonly dispid 148;
    property Creator: XlCreator readonly dispid 149;
    property Parent: IDispatch readonly dispid 150;
    property Borders: Borders dispid 435;
    property Font: Font dispid 146;
    property Interior: Interior dispid 129;
    property NumberFormat: OleVariant dispid 193;
    property NumberFormatLocal: OleVariant dispid 1097;
    property AddIndent: OleVariant dispid 1063;
    property IndentLevel: OleVariant dispid 201;
    property HorizontalAlignment: OleVariant dispid 136;
    property VerticalAlignment: OleVariant dispid 137;
    property Orientation: OleVariant dispid 134;
    property ShrinkToFit: OleVariant dispid 209;
    property WrapText: OleVariant dispid 276;
    property Locked: OleVariant dispid 269;
    property FormulaHidden: OleVariant dispid 262;
    property MergeCells: OleVariant dispid 208;
    procedure Clear; dispid 111;
  end;
26 июн 18, 07:48    [21520479]     Ответить | Цитировать Сообщить модератору
 Re: delphi ole excel findformat mergecells  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 47506
хм... вроде скомпилировался
  ExcelApp.FindFormat.MergeCells := true;
26 июн 18, 07:52    [21520481]     Ответить | Цитировать Сообщить модератору
 Re: delphi ole excel findformat mergecells  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10410
andreymx
хм... вроде скомпилировался
Вот и я удивился, что возникли какие-то проблемы
26 июн 18, 10:25    [21520947]     Ответить | Цитировать Сообщить модератору
 Re: delphi ole excel findformat mergecells  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 47506
как понять, что найдена ячейка (ячейки)? она может быть найдена, но без текста

var
  ExcelApp        : TExcelApplication
  ExcelObject     : Variant;
  FileName : string;
  Range1 : variant;
begin  ExcelApp := nil;
  ExcelApp := TExcelApplication.create(nil);
  ExcelApp.FindFormat.MergeCells := true;

  ExcelApp.Connect;


  ExcelObject := GetActiveOleObject('Excel.Application');

  filename := 'C:\qq\bad.xlsx';
  ExcelObject.Workbooks.open(FileName);
  ExcelObject.Range['a1:b14'].select;
  Range1 := ExcelObject.selection.Find(
      What := '',
      LookIn := xlValues,
      SearchOrder := xlByColumns,
      SearchDirection := xlNext,
      MatchCase:= False,
      SearchFormat:=True);
  showmessage(VarToStr(Range1) + '/' + VarTypeAsText(VarType(Range1)));
26 июн 18, 10:47    [21521056]     Ответить | Цитировать Сообщить модератору
 Re: delphi ole excel findformat mergecells  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10410
https://msdn.microsoft.com/en-us/vba/excel-vba/articles/range-find-method-excel
Return Value
A Range object that represents the first cell where that information is found.

Remarks
This method returns Nothing if no match is found. The Find method does not affect the selection or the active cell.
Что такое Nothing - сказать сложно. Посмотри какой будет VarType у возвращаемого результата?
26 июн 18, 12:45    [21521656]     Ответить | Цитировать Сообщить модератору
 Re: delphi ole excel findformat mergecells  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2623
andreymx,

Может если не найдено, то Range1 какой-то особенный станет? null, например?
26 июн 18, 12:47    [21521663]     Ответить | Цитировать Сообщить модератору
 Re: delphi ole excel findformat mergecells  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10410
Вот люди извращаются
26 июн 18, 12:52    [21521691]     Ответить | Цитировать Сообщить модератору
 Re: delphi ole excel findformat mergecells  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 47506
andreymx
надо найти, есть ли в выбранном диапазоне объединенные ячейки. Если есть - то может глючить загрузка ячеек в массив через Ole
наконец-то допёр, в чём дело

всё очень просто, но я тупил долго :)

когда выделяешь диапазон, а в этом диапазоне есть объединенные ячейки, выходящие за пределы выделяемого диапазона, то диапазон-то автоматически расширяется
я это тыщи раз наблюдал в самом экселе, но связать это со своей проблемой удалось далеко не сразу
4 июл 18, 23:42    [21544440]     Ответить | Цитировать Сообщить модератору
 Re: delphi ole excel findformat mergecells  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 47506
сделал контроль
    RequestedAddress := 'R' + IntToStr(FirstRow)            + 'C' + IntToStr(FirstCol) + ':' +
                        'R' + IntToStr(RowCount+FirstRow-1) + 'C' + IntToStr(ColCount+FirstCol-1);
    SelectionAddress := ExcelObject.selection.address[True, True, xlR1C1, EmptyParam, EmptyParam];
    if SelectionAddress <> RequestedAddress then
    begin
      msg := 'При загрузке данных выявлено наличие объединенных ячеек:'#13 +
             'запрошен диапазон ' + RequestedAddress + #13 +
             'получен  диапазон  ' + SelectionAddress + #13 +
             'Корректность данных не гарантирована!';

      iAlert := AlertStandard(msg, ['Продолжить', 'Прервать загрузку'], mtWarning);
      if iAlert = 2 then
      begin
        raise exception.Create(msg);
      end;
    end;
12 июл 18, 18:38    [21566966]     Ответить | Цитировать Сообщить модератору
 Re: delphi ole excel findformat mergecells  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 7778
Жуть какая-то...
if Cells[FirstRow,FirstCol].Resize[RowCount, ColCount].MergeCells<>null then...
12 июл 18, 18:58    [21567027]     Ответить | Цитировать Сообщить модератору
 Re: delphi ole excel findformat mergecells  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 47506
Соколинский Борис
Жуть какая-то...
if Cells[FirstRow,FirstCol].Resize[RowCount, ColCount].MergeCells<>null then...
OK, завтра попробую
12 июл 18, 19:02    [21567048]     Ответить | Цитировать Сообщить модератору
 Re: delphi ole excel findformat mergecells  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 47506
Соколинский Борис
Жуть какая-то...
if Cells[FirstRow,FirstCol].Resize[RowCount, ColCount].MergeCells<>null then...
вспомнил, проверил
    Range("c3:c4").Select
    If Selection.MergeCells Then
       MsgBox "mergedCells"
    Else
       MsgBox "no mergedCells"
    End If
    Range("c4:c4").Select
    If Selection.MergeCells Then
       MsgBox "mergedCells"
    Else
       MsgBox "no mergedCells"
    End If
это работает, только если в выделении все ячейки являются объединенными
в моем же примере в первом случае выдается no mergedCells

К сообщению приложен файл. Размер - 2Kb
12 июл 18, 20:20    [21567172]     Ответить | Цитировать Сообщить модератору
 Re: delphi ole excel findformat mergecells  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 7778
andreymx,
Это очень странно. Проверь макросом

Sub checkmerge()
  Dim V As Variant
  V = Selection.MergeCells

  If (V = Null) Or (V = False) Then
    MsgBox "No merged cells"
  Else
    MsgBox "Range contains merged cells"
  End If
End Sub
12 июл 18, 20:27    [21567184]     Ответить | Цитировать Сообщить модератору
 Re: delphi ole excel findformat mergecells  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 47506
Sub checkmerge()
  Dim V As Variant
  
  Range("a1:a1").Select
  V = Selection.MergeCells
    
  If (V = Null) Then
    MsgBox "merged=null"
  ElseIf (V = False) Then
    MsgBox "merged=false"
  ElseIf (V = True) Then
    MsgBox "merged=true"
  Else
    MsgBox "merged=[" + merged + "]"
  End If

  Range("c3:c4").Select
  V = Selection.MergeCells
    
  If (V = Null) Then
    MsgBox "merged=null"
  ElseIf (V = False) Then
    MsgBox "merged=false"
  ElseIf (V = True) Then
    MsgBox "merged=true"
  Else
    MsgBox "merged=[" + merged + "]"
  End If

  Range("c4:c4").Select
  V = Selection.MergeCells
    
  If (V = Null) Then
    MsgBox "merged=null"
  ElseIf (V = False) Then
    MsgBox "merged=false"
  ElseIf (V = True) Then
    MsgBox "merged=true"
  Else
    MsgBox "merged=[" + merged + "]"
  End If

End Sub


Range("a1:a1").Select
merged=false

Range("c3:c4").Select
merged=[]

Range("c4:c4").Select
merged=true

К сообщению приложен файл. Размер - 4Kb
13 июл 18, 09:19    [21567845]     Ответить | Цитировать Сообщить модератору
 Re: delphi ole excel findformat mergecells  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 47506
Range("a1:a1").Select
merged=false
Selection.Address=R1C1

Range("c3:c4").Select
merged=[]
Selection.Address=R3C3:R5C4

Range("c4:c4").Select
merged=true 
Selection.Address=R4C3:R5C4
13 июл 18, 09:23    [21567857]     Ответить | Цитировать Сообщить модератору
 Re: delphi ole excel findformat mergecells  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 47506
похожая ситуация описана здесь
https://social.msdn.microsoft.com/Forums/office/en-US/ccb3a704-1f7f-4ce7-b212-90fbe698597f/question-about-rangemergecells-and-rangehasarray?forum=exceldev
13 июл 18, 09:26    [21567862]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить