دیو به روشی در ماکرو نیاز دارد تا تعیین کند چند ستون در پنجره یا صفحه فعلی قابل مشاهده است.
این در واقع بسیار آسان برای انجام است. ترفند این است که به یاد داشته باشید که باید با شی VisibleRange که متعلق به شی ActiveSheet است کار کنید. می توانید از مجموعه .Columns برای شی VisibleRange استفاده کنید و سپس از متد .Count برای آن مجموعه استفاده کنید. چیزی که در نهایت به آن می رسید تعداد ستون ها است، به این ترتیب:
Sub VisibleColCount()
Dim sTemp As String
sTemp = "There are "
sTemp = sTemp & ActiveWindow.VisibleRange.Columns.Count
sTemp = sTemp & " columns visible."
MsgBox sTemp
End Sub
ساده به نظر می رسد، درست است؟ مشکل این است که متد .Count تعداد ستونهای مجموعه را خواه مخفیشده باشند یا نه، برمیگرداند. به عنوان مثال، اجازه دهید بگوییم که به صفحه نگاه میکنید و میبینید که ستونهای C تا H را نشان میدهد. این به این معنی است که 6 ستون نمایش داده میشود، و این همان چیزی است که روش .Count در ماکرو بالا برمیگرداند. اگر ستون F را مخفی کنید، اکنون ستون های C تا I نمایش داده می شوند. به جای .Count که هنوز 6 را برمی گرداند (نماینده ستون های C، D، E، G، H، و I)، اکنون 7 را برمی گرداند که شامل ستون پنهان است، حتی اگر قابل مشاهده نباشد.
راه حل این وضعیت بررسی ویژگی .Hidden هر ستون در مجموعه .Columns است. تنها در صورتی که خاصیت .Hidden False باشد، باید ستون را به عنوان قابل مشاهده بشمارید، به این ترتیب:
Sub VisibleColCount()
Dim c As Range
Dim iCount As Integer
Dim sTemp As String
iCount = 0
For Each c In ActiveWindow.VisibleRange.Columns
If Not c.Hidden Then iCount = iCount + 1
Next c
sTemp = "The active window includes "
sTemp = sTemp & ActiveWindow.VisibleRange.Columns.Count
sTemp = sTemp & " columns. Of those columns, "
If iCount = ActiveWindow.VisibleRange.Columns.Count Then
sTemp = sTemp & "all "
Else
sTemp = sTemp & "only "
End If
sTemp = sTemp & iCount & " are visible."
MsgBox sTemp
End Sub
یک مشکل دیگر با این رویکرد وجود دارد: تا جایی که به VBA مربوط می شود، یک ستون تا زمانی که فقط یک تکه از آن ستون نشان داده شود قابل مشاهده است. همچنین، اگر پیشبینی میکنید که از پنجرهها در صفحه نمایش اکسل خود استفاده کنید، ممکن است بخواهید شی ActivePane را به ترکیب اضافه کنید. اساساً، یک تغییر ساده در ماکروهای بالا انجام می شود: هر جایی که شی ActiveWindow را می بینید، آن را با ActivePane دنبال کنید، مشابه این:
For Each c In ActiveWindow.ActivePane.VisibleRange.Columns
این تضمین می کند که ماکرو شما در هنگام شمارش فقط به صفحه فعلی در پنجره نگاه می کند.