دستور مخفی کردن sheet در VB

Collapse
این تاپیک قفل است.
X
X
 
  • زمان
  • نمایش
حذف همه
new posts
  • 2009tv

    • 2016/01/23
    • 40

    [حل شده] دستور مخفی کردن sheet در VB

    با سلام و احترام
    ممنونم از پاسخگویی و کمک شما دوست عزیز (البته استاد من محسوب میشوید)
    مقدمه:
    من یک دستور ساده نوشته ام که تمام شیت ها را بجز چند شیت مخفی میکند. که نمونه دستور در زیر ارائه شده است.
    سوال:
    1) آیا این دستور امکان خلاصه شدن را دارد؟ (مثلاً تمام شیط ها را مخفی کند بجز چند شیط خاص)
    2) آیا بطور کلی خلاصه کردن دستورات تاثیری بر روی سرعت انجام دستورات دارد؟
    نمونه دستور:
    Sub formhide()
    Sheet7.Visible = xlSheetVisible
    Sheet3.Visible = xlSheetVisible
    Sheet4.Visible = xlSheetVisible
    Sheet5.Visible = xlSheetVisible
    Sheet1.Visible = xlSheetVisible
    Sheet6.Visible = xlSheetHidden
    Sheet10.Visible = xlSheetHidden
    Sheet8.Visible = xlSheetHidden
    Sheet11.Visible = xlSheetHidden
    Sheet9.Visible = xlSheetHidden
    Sheet12.Visible = xlSheetHidden
    Sheet13.Visible = xlSheetHidden
    Sheet15.Visible = xlSheetHidden
    Sheet14.Visible = xlSheetHidden
    Sheet1.Visible = xlSheetHidden
    Sheet16.Visible = xlSheetHidden
    Sheet17.Visible = xlSheetHidden
    Sheet21.Visible = xlSheetHidden
    Sheet22.Visible = xlSheetHidden
    Sheet23.Visible = xlSheetHidden
    Sheet21.Visible = xlSheetHidden
    Sheet19.Visible = xlSheetHidden
    Sheet24.Visible = xlSheetHidden
    Sheet18.Visible = xlSheetHidden
    Sheet20.Visible = xlSheetHidden
    Sheet7.Activate
    End Sub
    Last edited by 2009tv; 2016/06/27, 11:49.
  • Amir Ghasemiyan

    • 2013/09/20
    • 4598
    • 100.00

    #2
    سلام دوست عزیز
    یک قاعده کلی رو همیشه تو ذهنتون داشته باشید. وقتی یک کار مشابهی داره چندین بار تکرار میشه مطمئن باشید یک حلقه میشه جایگزین تکرار کرد

    این یک نمونه کد خدمت شما:
    کد:
    Sub HideSheets()
    Dim sht As Worksheet
    For Each sht In ActiveWorkbook.Worksheets
        If sht.Name <> "Sheet2" Then sht.Visible = False
    Next sht
    End Sub

    کامنت

    • Amir Ghasemiyan

      • 2013/09/20
      • 4598
      • 100.00

      #3
      من الان دقت کردم دیدم شما چند تا شیت رو ویزیبل کردین چندتا رو اینویزیبل
      برای اینکار من کد زیر رو پیشنهاد میدم:
      کد:
      Sub HideSheets()
      Dim sht As Worksheet
      For Each sht In ActiveWorkbook.Worksheets
          visibles = Array("sheet1", "sheet2")
          If IsError(Application.Match(sht.Name, visibles, False)) Then
              sht.Visible = xlSheetHidden
          Else
              sht.Visible = xlSheetVisible
          End If
      Next sht
      End Sub

      کامنت

      • 2009tv

        • 2016/01/23
        • 40

        #4
        عالی و آموزنده بود!

        اما دستور عنوان شده دوم برای من خطا میدهد:
        آیا تابع شرط را می توان بصورتی ساده تر نوشت که نسبت به حالات خاص کمتر حساس باشه!

        ممنونم. مثل همیشه برادرانه و مانند یه استاد راهنمایی ام کردید.
        در پناه خدا
        Last edited by 2009tv; 2016/06/27, 14:14.

        کامنت

        • Amir Ghasemiyan

          • 2013/09/20
          • 4598
          • 100.00

          #5
          خواهش میکنم
          حل کردن تاپیک یادتون نره

          کامنت

          • 2009tv

            • 2016/01/23
            • 40

            #6
            میشه لطف کنید راهنمایی کنید که تابع شرط را کمی ساده تر و یا بشکلی دیگر بنویسم که خطا ندهد چون این دستور برای من خطا میدهد.
            (مثلاً تابع شرط عنوان کند اگر نام شیت ها شامل نام های موجود در آرایه بود، آشکار شوند و در غیر اینصورت مخفی شوند)

            کامنت

            • Amir Ghasemiyan

              • 2013/09/20
              • 4598
              • 100.00

              #7
              نوشته اصلی توسط 2009tv
              میشه لطف کنید راهنمایی کنید که تابع شرط را کمی ساده تر و یا بشکلی دیگر بنویسم که خطا ندهد چون این دستور برای من خطا میدهد.
              (مثلاً تابع شرط عنوان کند اگر نام شیت ها شامل نام های موجود در آرایه بود، آشکار شوند و در غیر اینصورت مخفی شوند)
              چه خطایی دریافت میکنین دوست عزیز؟
              الان شرطی که نوشتم دقیقا همین چیزی که شما گفتین رو بررسی میکنه

              بجای تابع MATCH که گذاشتم میتونین اینطوری هم استفاده کنید:

              کد:
              Sub HideSheets()
              Dim sht As Worksheet
              For Each sht In ActiveWorkbook.Worksheets
                  visibles = Array("Sheet1", "Sheet2")
                  If UBound(Filter(visibles, sht.Name)) < 0 Then
                      sht.Visible = xlSheetHidden
                  Else
                      sht.Visible = xlSheetVisible
                  End If
              Next sht
              End Sub

              کامنت

              • 2009tv

                • 2016/01/23
                • 40

                #8
                دوباره اخطار داد فکر کنم مشکل از فایل خودم است.
                حال می خواهم دستور را بصورتی ساده تر بنویسم.
                مثلاً اینطوری دستور را به vb معرفی کنم:
                x شامل تمام شیت ها
                y آرایه ای شامل نام چند شیت (مثلاً "sheet7", "sheet3", "sheet4", "sheet5", "sheet1" )
                z شامل تمام شیط های x به غیر از شیط های عنوان شده در y
                حالا دستور وارد کنیم:
                y.Visible = xlSheetVisible
                z.Visible = xlSheetHidden
                اگر امکانش هست برای همچین دستوری راهنماییم کنید! (البته میدونم خیلی سطحی و ساده است)
                *متاسفم برای یک سوال خیلی وقتتان را گرفتم*
                در ضمن نگفتید خلاصه کردن دستورات آیا تاثیری در سرعت دارد؟ (مثلاً همین دستور)
                ممنونم

                کامنت

                • Amir Ghasemiyan

                  • 2013/09/20
                  • 4598
                  • 100.00

                  #9
                  نوشته اصلی توسط 2009tv
                  دوباره اخطار داد فکر کنم مشکل از فایل خودم است.
                  حال می خواهم دستور را بصورتی ساده تر بنویسم.
                  مثلاً اینطوری دستور را به vb معرفی کنم:
                  x شامل تمام شیت ها
                  y آرایه ای شامل نام چند شیت (مثلاً "sheet7", "sheet3", "sheet4", "sheet5", "sheet1" )
                  z شامل تمام شیط های x به غیر از شیط های عنوان شده در y
                  حالا دستور وارد کنیم:
                  y.Visible = xlSheetVisible
                  z.Visible = xlSheetHidden
                  اگر امکانش هست برای همچین دستوری راهنماییم کنید! (البته میدونم خیلی سطحی و ساده است)
                  *متاسفم برای یک سوال خیلی وقتتان را گرفتم*
                  در ضمن نگفتید خلاصه کردن دستورات آیا تاثیری در سرعت دارد؟ (مثلاً همین دستور)
                  ممنونم

                  فایلتون رو اگه میتونین بذارین ببینم شاید مشکل از آفیستون باشه

                  این چیزی که شما میگین تصور شماست که ساده تره اما تفهیم این موضوع به اکسل کار رو فقط پیچیده میکنه. کدی که من نوشتم میگه همه شیت ها رو نگاه کن (x). اگر دیدی شیتی که داری بررسی میکنی جزو لیست ویزیبل من هست (y) ویزیبلش کن وگرنه مخفی کن. دیدین؟ اصلا نیاز به z نداریم

                  در مورد زمان چندین پارامتر هست. فقط کدها موثر نیستن. اما من فکر کنم بهتره ماهی گیری یادتون بدم
                  کد زیر مدت زمان اجرای کد رو براتون مشخص میکنه. بعد میتونین خودتون تشخیص بدین کدوم کد زمان بیشتری میبره کدوم کمتر
                  کد:
                  Sub HideSheets()
                  Dim sht As Worksheet
                  Dim StartTime, SecondsElapsed As Double
                  'Remember time when macro starts
                  StartTime = Timer
                  'Your codes
                  For Each sht In ActiveWorkbook.Worksheets
                      visibles = Array("Sheet1", "Sheet2")
                      If UBound(Filter(visibles, sht.Name)) < 0 Then
                          sht.Visible = xlSheetHidden
                      Else
                          sht.Visible = xlSheetVisible
                      End If
                  Next sht
                  
                  
                  'Determine how many seconds code took to run
                  SecondsElapsed = Round(Timer - StartTime, 2)
                  
                  
                  'Notify user in seconds
                  MsgBox "This code ran successfully in " & SecondsElapsed & " seconds", vbInformation
                  End Sub

                  کامنت

                  چند لحظه..