这的确是个很偏门的问题,请大家帮帮我!!!(50分)

  • 主题发起人 飞雪轩主
  • 开始时间

飞雪轩主

Unregistered / Unconfirmed
GUEST, unregistred user!
最近在搞Excel控制的程序,在处理合并单元格时难住了。我要通过循环的方法把选定区域
的所有单元格存入数据库,如果判断是被合并了就打个Merge为真的标记。并能通过Merge的
MergeArea.Rows.Count;和MergeArea.Columns.Count;属性取得单元格的行与列总数。我要用
这个算出从哪个格子合并到哪个格子部分代码如下:从代码可以看出我是通过行与列的总数
MerX:=(I-1)+ExcelWorkSheet1.Range[Cell1,Cell2].MergeArea.Rows.Count;
MerY:=(J-1)+ExcelWorkSheet1.Range[Cell1,Cell2].MergeArea.Columns.Count;
可以得出最后一个单元格但是用的是循环的方法。只有第一个格子是准的,同一个合并单元格
中其它的就不准了。我想请问怎样才能判断出当前的单元格是否是合并单元中的第一个格子?
或者是有什么其它的办法?
procedure TfrmMain.ExcelWorkbook1SheetActivate(Sender: TObject;
var Sh: OleVariant);
begin
ExcelWorkSheet1.ConnectTo(ExcelWorkBook1.ActiveSheet as _WorkSheet);
end;

procedure TfrmMain.Button7Click(Sender: TObject);
var
DTID,Str: String;
I,J: Integer;
Cell1,Cell2: OLEVariant;
MergeBool: Boolean;
MerX,MerY: Variant;
MerWidth: Variant;
aa: String;
CelWidth,CelHeight,Width,Height,Top,Left: Variant;//格子的属性
// ControlType: String;
//表现的控件类型
begin
if dxDBTreeList1.FocusedNode <> Nil then
begin
Str:=dxDBTreeList1.FocusedNode.Strings[0];
ParentID:=GetParentID(Str);
X1:=dxDBTreeList1.FocusedNode.Values[1];
Y1:=dxDBTreeList1.FocusedNode.Values[2];
X2:=dxDBTreeList1.FocusedNode.Values[3];
Y2:=dxDBTreeList1.FocusedNode.Values[4];
DTID:=FormatDateTime('yyyymmdd',NOw)+FormatDateTime('hhmmss',Time);
for J:=Y1 to Y2 do
begin
for I:=X1 to X2 do
begin
MergeBool:=False;
MerWidth:='0';
Cell1:=ExcelWorkSheet1.Cells.Item[I,J];
Cell2:=ExcelWorkSheet1.Cells.Item[I,J];
MerX:=I;
MerY:=J;
if ExcelWorkSheet1.Range[Cell1,Cell2].MergeCells=True then
begin
aa:=ExcelWorkSheet1.Range[Cell1,Cell2].Value;
if aa<>'' then
begin
MergeBool:=True;
//是否被合并单元格
MerX:=(I-1)+ExcelWorkSheet1.Range[Cell1,Cell2].MergeArea.Rows.Count;
MerY:=(J-1)+ExcelWorkSheet1.Range[Cell1,Cell2].MergeArea.Columns.Count;
MerWidth:=ExcelWorkSheet1.Range[Cell1,Cell2].MergeArea.Width;
end;
if aa='' then
begin
MerX:=I;
MerY:=J;
MergeBool:=False;
MerWidth:='False';
end;
end;
//以下为添充格式到表
CelWidth:=Cell1.ColumnWidth;
CelHeight:=Cell1.RowHeight;
Width:=Cell1.Width;
Height:=Cell1.Height;
Top:=Cell1.Top;
Left:=Cell1.Left;
ADOQuery1.Append;
ADOQuery1.FieldByName('UUID').Value:=ParentID+IntToStr(I)+IntToStr(J);
ADOQuery1.FieldByName('RangeName').Value:=IntToStr(I)+','+IntToStr(J);
ADOQuery1.FieldByName('X1').Value:=I;
ADOQuery1.FieldByName('Y1').Value:=J;
ADOQuery1.FieldByName('X2').Value:=MerX;
ADOQuery1.FieldByName('Y2').Value:=MerY;
ADOQuery1.FieldByName('TimeStamp').Value:=DTID;
ADOQuery1.FieldByName('ParentID').Value:=ParentID;
ADOQuery1.FieldByName('RangeType').Value:='Cell';
ADOQuery1.FieldByName('MergeCells').Value:=MergeBool;
ADOQuery1.FieldByName('MerWidth').Value:=MerWidth;
ADOQuery1.FieldByName('Height').Value:=CelHeight;
ADOQuery1.FieldByName('Width').Value:=CelWidth;
ADOQuery1.FieldByName('ConHeight').Value:=Height;
ADOQuery1.FieldByName('ConWidth').Value:=Width;
ADOQuery1.FieldByName('ConTop').Value:=Top;
ADOQuery1.FieldByName('ConLeft').Value:=Left;
ADOQuery1.Post;
//以下为添充数据到表
ADOQuery3.Append;
ADOQuery3.FieldByName('UUNodeID').Value:=ParentID+IntToStr(I)+IntToStr(J);
ADOQuery3.FieldByName('PARENT').Value:=ParentID;
ADOQuery3.FieldByName('DataStream').Value:=ExcelWorkSheet1.Cells.Item[I,J].value;
ADOQuery3.FieldByName('TimeStamp').Value:=DTID;
ADOQuery3.Post;
end;
end;
end;
end;
 
这里我把问题简化一个就一句话
怎样判断出当前的单元格是否为合并单元格中的第一个格子?
 
再一UP下
 
从格式中得不到信息吗?
 
是的得不到
如果您知道请告知方法
 
你的问题,我应该找到解决方法了,至少提供了一种思路。
在Excel中,对于非合并单元格,用手工和程序的方法都可以“选中”。
对于合并的单元格,如果它不是合并块的左上单元格,手工是没法
“选中”的。但程序可以“选择”它,最终的结果如何呢?
最终的结果是:“选中”了合并块的左上角单元格。
这样我们可以在程序中“选择”单元格,然后根据选择的结果来判断。
如果“选中”的单元格就是要“选择”的单元格,那么这个单元格
要么是非合并(普通)单元格,要么是合并块的左上单元格;
如果“选中”的单元格不是要“选择”的单元格,那么要“选择”
的单元格肯定是合并单元格,而且“选中”的单元格是合并块的左上
单元格;
以下是我在Excel中用于调试的宏:
Sub 宏1()
'
' 宏1 Macro
' xxc 记录的宏 2002-8-14
' D7:E14是合并单元格
'
Range("e8").Select
MsgBox (Selection.Row) '返回的是 7,而不是 8
MsgBox (Selection.Column) '返回的是 4,而不是 5(E)
End Sub
我想剩下的你应该能解决,如有疑问,再探讨!祝好运。
 
顶部