2012-12-07 69 views
1

有没有办法获得第一个非隐藏列的列号?Excel VBA:从左侧返回第一个未隐藏的列?

因此,如果列A被隐藏,返回2.
如果列A和B被隐藏,返回3.
如果A和C被隐藏,返回2等

+0

我很好奇如何_“有没有办法获得第一个非隐藏列的列号?”_尚不清楚。我搜索了一个解决这个问题的方法,这个问题出现在结果中,我很清楚要问什么。那些投票决定关闭熟悉Excel和VBA的问题的人?顺便说一下,不要讽刺,只是真正想明白为什么这个问题已经结束,以便更好地理解什么是可以接受的,哪些不是。 –

回答

3
Sub test() 

    Dim ColCounter As Integer 

    ColCounter = 1 
    Do While ColCounter > 0 And ColCounter < 66536 
     If Sheet1.Columns(ColCounter).Hidden = False Then 
      MsgBox (ColCounter) 
      Exit Do 
     End If 
     ColCounter = ColCounter + 1 
    Loop 

End Sub 
+0

都可以返回1这个作品 - 谢谢! – KaliMa

+0

不客气... – bhuang3

+0

整数的最大值是32767,因此检查<65536是重复的。 – Tmdean

0

尝试这

ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Offset(1, 0).End(xlToLeft).Column 

编辑

证明是不工作 enter image description here

+1

不幸的是不起作用 – KaliMa

+0

适合我。请解释您遇到的问题。 –

+1

无论什么 – KaliMa

4

没有循环

更新:没有处理,其中最左边的列已隐藏的情况。如果没有单元测试是多余然后Tmdean的更短的搜索解决方案优于

Sub FirstNonHidden() 
Dim rng1 As Range 
Set rng1 = Cells.SpecialCells(xlCellTypeVisible) 
If rng1.Column <> 1 Then 
MsgBox rng1.Areas(1).Column 
Else 
MsgBox "No hidden cells" 
End If 
End Sub 
3

最简单的方法可能是

Dim column_num As Long 
column_num = ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible).Cells(1).Column 

使用循环会有点更有效,不过,像bhuang3的解决方案,但它可以做得更简单一点。

Dim cursor As Range, column_num As Long 
Set cursor = Range("A1") 
Do Until cursor.ColumnWidth > 0 
    Set cursor = cursor.Offset(0, 1) 
Loop 

column_num = cursor.Column 
+0

无论任何单元被隐藏或不。 – brettdj

+0

是的......这就是它根据我对这个问题的阅读所应该做的... – Tmdean

+0

+1。进一步的想法我同意 – brettdj