range的Previous()和Next()可以获取当前区域的前一个或后一个单元格,但是我想获取当前区域前一个区或后一个区域怎么办啊(不是单元格)?
比如,rg的地址是C1,前面两个单元格A1和B1是合并的,那我使用rg1=rg.Previous(),返回的rg1地址是B1。怎么样才能得到合并的单元格首地址呢,即返回的是单元格A1。急求!!
好像EXCEL里面返回合并单元格的功能非常少,都是返回单一的单元格
这个问题困扰我好久了,期待这次能解决。

解决方案 »

  1.   

    '默认你所谓的区域是合并单元格,首先判断前区是否是合并单元格if rg.Previous.MergeCells then    debug.print rg.Previous.MergeArea.Address         '结果是$A$1:$B$1,如果你只要A1还需截取else    debug.print rg.Previous.addressendif
      

  2.   

    rg.Previous返回的永远是单一的单元格(也就是这个例子中的B1),so rg.Previous.MergeCells永远会是假的,你可以测试下。这个就是我所要解决的问题:有没有其他方法获取前一个区域,这个区域可以是合并的单元格,类似于shift+tab或者左方向键的效果
      

  3.   

    LZ,我想说的是,请你先测试一下再来说代码的正确与否,谢谢。我给您写的那部分是经过我的测试的,如果您测试结果不同,请上传个图片,一起研究。但是您所回复的内容显然有很多不正确的概念。如:“rg.Previous返回的永远是单一的单元格(也就是这个例子中的B1)”请先看帮助,Previous返回的是一个range对象。综上,请LZ务必理解代码以后再测试,不要妄下结论,谢谢
      

  4.   

    首先谢谢你的回答。我其实用的是vc开发的,由于vc板块求助未果,因此发到VBA板块。
    Previous方法是我在项目中用到的方法,未获得我所要的(获取合并单元格区域),所以才来求助的,以下是我今天测试的代码,获取的地址是B2,而不是合并区域的地址。由于用的是VS2008,因此Previous函数前有一个get_的附加,其实功能和Previous是一样的。

    CRange rgMyRge,rgPreRge;
    CString csAdd;
    rgMyRge=m_wsMysheet.get_Range(COleVariant("C2"),vtMissing);//C2
    rgPreRge=rgMyRge.get_Previous();//前一个区域
    //由于我已经确定前一个区域是合并单元格,所以这里不进行是否是合并单元格的判断
    csAdd = rgPreRge.get_Address(vtMissing,vtMissing,(long)1,vtMissing, vtMissing);//前一个区域地址
    //调试获取的csAdd为"$B$2"
    另附上EXCEL帮助Previous的说明:可以看到确实是返回单元格的,但同时也说明了作用是仿效 Shift+Tab。我试了Shift+Tab的效果却是选中前一个区域。这个矛盾我一直想不明白。
    可能VC测试结果和VB测试结果不一样吧,或许我使用的参数不对?
      

  5.   

    汗论坛发帖新人,插入代码不正确,图片链接也不正确,见谅见谅~~
    话说csdn的相册怎么上传不了啊,一直提示请选择图片,我在百度空间上传了再插入,但是显示的是叉叉闹
      

  6.   

    LZ,确实不太懂VC。但是很明显,如果你只是单纯用的是Previous方法,得到的肯定是B2。但在我贴的vba代码中
    用的是Previous.MergeArea.Address。这样取得的是合并区域的地址,如$A$1:$B$1。这样就能得到区域的第一个单元格地址。不知道VC是否可以实现,vba肯定没问题。
      

  7.   

    谢谢,在你的帮助下,解决问题了,非常感谢,问题出在VC里面的MergeCells,如果是合并单元格的话是返回-1,而不是1,因此之前我都一直认为得到的不是合并的单元格,另外,要得到合并单元格的地址的话需要使用Previous.MergeArea.Address来得到,直接用Address是得不到的。