VBA获取区域的起始行、结束行

本文介绍如何利用VBA的Range.MergeArea属性获取Excel单元格所在合并区域的起始行和结束行。通过Range.Address属性可以得到区域的宏语言表示,进一步解析此字符串以确定范围细节。

用到的属性

Range.MergeArea,返回 Range 对象,代表包含指定单元格的合并的范围。如果指定的单元格不在合并的范围内,则该属性返回指定的单元格。只读。Variant类型。

Range.Address,以宏语言返回区域引用。String 类型,只读。如::$A$3:$A$10

o_xls.Visible = TRUE
o_xls.WindowState = -4140  //最小化

o_WorkBook = o_xls.Workbooks.Open(ls_FileName)

o_sheet = o_WorkBook.Sheets(4)	//应付账款表

ll_RowCount = o_sheet.UsedRange.Rows.Count

//ls_Msg = ""
//ls_dyg = "A3"
//
//o_Range = o_sheet.Range(ls_dyg).MergeArea
//
//ls_AddRess = o_Range.Address		//返回区域的范围:$A$3:$A$10
//
//wf_Get_Range_AddRess(ls_AddRess,ll_StartRow,ll_EndRow)	//解析起始行号、结束行号的字符串
//
////获取起始行
//ls_Msg = ls_Msg + "起始行:" + String(ll_StartRow) + " ; " 
//
//ls_Msg = ls_Msg + "结束行:" + String(ll_EndRow) +  "~r~n"
//


//IF o_sheet.Range("A3").MergeCells = TRUE THEN
//	MessageBox("A3","合并单据元格")
//ELSE
//	MessageBox("A3","不是")
//END IF

FOR ll_Row = 3 TO ll_RowCount
	ls_dyg = "A" + String(ll_Row)
	IF o_sheet.Range(ls_dyg).MergeCells = TRUE THEN
		ls_AddRess = o_Sheet.Range(ls_dyg).MergeArea.Address	//获取合并单元格的范围,$A$3:$A$10
		wf_Get_Range_AddRess(ls_AddRess,ll_StartRow,ll_EndRow)	//解析地址范围,获取起始行号、结束行号
		ls_gznr = o_Sheet.Range(ls_dyg).Value
		ls_Msg = ls_Msg + "合并单元格【" + ls_dyg + " : " + ls_AddRess + "】:" + "起始行:" + String(ll_StartRow) + " ; 结束行:" + String(ll_EndRow) + " ; 挂账内容:" + ls_gznr + "~r~n"	
		
		ll_Row = ll_EndRow 
	ELSE
		//非合并单元格
		ls_gznr = o_Sheet.Range(ls_dyg).Value
		ls_Msg = ls_Msg + "非合并单元格【" + ls_dyg + "】:"
		ls_Msg = ls_Msg + "行:" + String(ll_Row) + " ; 挂账内容:" + ls_gznr + "~r~n"
	END IF
NEXT

//关闭
o_WorkBook.Close(FALSE)
o_xls.WorkBooks.close()
o_xls.quit

destroy o_sheet
destroy o_workbook
destroy o_xls

fu_error(ls_Msg)

MessageBox("提示","测试结束")

解析区域范围字符串的函数

/*====================================================================
> Function: w_pzdr_yfzk.wf_get_range_address
>--------------------------------------------------------------------
> 描述:  获取区域的起始行和结束行,解析字符串:$A$3:$A$10
>--------------------------------------------------------------------
> 参数: 
       String ls_AddRess	区域范围的字符串,$A$3:$A$10
> 	ref long ll_startrow		引用方式,起始行号
> 	ref long ll_endrow	   引用方式,结束行号
>--------------------------------------------------------------------
> 返回:  (none)
>	
====================================================================*/

long ll_IndexStart,ll_IndexEnd,ll_Len
String ls_StartRow,ls_EndRow

//第一个$的位置
ll_IndexStart = Pos( ls_AddRess,"$")
//第二个$的位置
ll_IndexStart = Pos( ls_AddRess,"$" , ll_IndexStart + 1 )
//":"的位置
ll_IndexEnd = Pos ( ls_AddRess,":", ll_IndexStart + 1 )
//起始行
ll_Len = ll_IndexEnd - ll_IndexStart - 1 
ls_StartRow = Mid(ls_AddRess,ll_IndexStart + 1 ,ll_Len)

//第三个$的位置
ll_IndexStart = Pos ( ls_AddRess,"$",ll_IndexStart + 1 )
//第四个$的位置
ll_IndexStart = Pos ( ls_AddRess,"$",ll_IndexStart + 1 )
//结束行
ls_EndRow = Mid(ls_AddRess,ll_IndexStart + 1 )

//fu_error("【wf_Get_Range_AddRess : " +  ls_AddRess + "】起始行号:" + ls_StartRow + " ; 结束行号:" + ls_EndRow )

ll_StartRow = long(ls_StartRow)
ll_EndRow = long(ls_EndRow)




评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值