AutoFill متغیر

Collapse
X
 
  • زمان
  • نمایش
حذف همه
new posts
  • master

    • 2010/07/18
    • 118

    AutoFill متغیر

    سلام
    من یه ماکرو رو به صورت دستی record کردم
    موقع record توی یکی از ستون ها از AutoFill استفاده کردم خونه اول دوم و سوم رو از 1 تا 3 دادم و بعد AutoFill کردم تا اخرین خونه ای که مقدار داشت از ستون مجاورش
    یعنی فرض ستون A تا سطر 55 مقدار داره منم AutoFill رو تا 55 سطر ادامه دادم

    اما مشکلی که الان دارم این ماکرو رو میخوام جاهای دیگه استفاده کنم ولی اون ستون مجاور هر دفعه تعداد خونه هاش فرق میکنه مثلا ممکنه 100 تا باشه و AutoFill باید تا 100 بره
    من توی کد زیر چه تغییراتی بدم تا مشکلم حل بشه:
    Selection.AutoFill Destination:=Range("G1:G124")
    فکر کنم اگه بشه قسمت رنج رو متغییر داد که وابسته با ستون مجاور بشه مشکل حل میشه ولی بلد نیستم
    ======
    ضمنا دو تا سوال مرتبط(هر دو هم برا استفاده در vba میخوام)
    البته سوال اول خودش چند بخشی هست!
    1- توی یه ستون مثلا A با چه کدی میتونیم:
    تعداد سطر های غیر خالی رو بدست بیاریم؟(جواب یه عدد باشه)
    اولین سلول خالی شمارش چنده؟
    اخرین سلول پر شمارش چنده؟(اولین سلول خالی که بعدش دیگه سلول پر نباشه)
    در مورد قسمت دوم و سوم جواب به چه صورت هست؟ مثلا میگه سلول 50 خالی هست یا اسم خونه رو میده مثلا A50 یا ادرس افست سلول خالی رو میده (اگه اشتباه نکنم ادرس افست به صورت cell(1,50) میشه)
    اصلا میتونیم خودمون بگیم به کدوم صورت جواب بده؟

    2- چطوری میشه محدوده Range رو متغییر داد؟
    مثل داریم
    Range("G1:K10)
    چطور میشه به جای 1 و 10 از متغییر استفاده کرد؟
    کلا میخوام Range رو متغییر بدم و نمیخوام مثل الان نام یک سلول ثابت مثلا G1 باشه بلکه میخوام Gi باشه که خود i متغییری هست که داخلش یه عدد هست حالا به هر صورتی میشه بگید
    با تشکر
  • Ali Parsaei
    مدير تالارتوابع اکسل

    • 2013/11/18
    • 1522
    • 71.67

    #2
    سلام،
    براي رسيدن به پاسخ بايد مباني VBA را مطالعه کنيد.
    لزومي ندارد که فکر کنيد يک چيز عظيمي است و ياد گرفتن آن کلي وقت مي خواهد! کافي است يک چيزهاي ابتدايي را ياد بگيريد، ابتدا هر چيزي که به آن احتياج داريد را ياد بگيريد.
    من به صورت اجمالي يک توضيح راجع به متغيير کردن RANGE مي دهم.
    حق با شما است، وقتي با ماکرو يک چيزي را ضبط مي کنيم کدهاي ضبط شده مخصوص يک RANGE مشخص مي باشد و همين امر کاربران را گيج مي کند.
    براي حل مشکل بايد از متغييرها در کد استفاده کرد
    براي معرفي يک متغيير از عبارت DIM استفاده مي شود ضمنا" در هنگام تعريف متغيير بايد نوع آن را نيز تعريف کنيد. يعني بايد تعيين کنيد در اين متغيير چه نوع داده هايي را مي خواهيد ذخيره کنيد.
    فرضا" دستور DIM C AS INTEGER يعني من متغييري تعريف مي کنم که از آن به عنوان محل ذخيره اعداد صحيح استفاده مي گردد
    يا دستور DIM C AS RANGE يعني من متغييري تعريف مي کنم که از آن به عنوان محل ذخيره آدرس سل ها استفاده مي گردد
    کلا" بايد يک کم مطالعه بفرماييد، نمونه فايل هاي توي انجمن هم خيلي مفيد خواهد بود، در فروشگاه انجمن هم جزوات و مطالب طبقه بندي شده و مفيدي هست.
    من يک کد به عنوان مثال هم برايتان مي نويسم، به کد زير توجه کنيد:
    کد PHP:
    Dim C As Range
    For Each C In Range("A:A")
    If 
    0 Then
    MsgBox 
    (C.Address)
    Exit For
    End If
    Next 
    تفسير کد فوق خط به خط تقريبا" به اين نحو است:
    متغيير C براي ذخيره دادهاي از نوع RANGE معرفي مي گردد
    براي هر C در ستون A
    اگر C بزرگتر از صفر بود سپس عمل زير را انجام بده:
    يک MSGBOX (مسج بکس يا کادر پيغام) به ما نشان بده که در آن آدرس C را نشان دهد
    از دستوري که با عبارت FOR در بالا شروع شده بود خارج شو و ديگر ادامه اش نده
    پايان دستوري که با عبارت IF در فوق شروع شده
    عبارت NEXT هم حتما بايد در پايان کدهايي که با FOR شروع مي شوند نوشته شود (هرچند دو خط بالاتر از ادامه دستور FOR صرف نظر کرده ايم)
    [SIGPIC][/SIGPIC]

    کامنت

    • generalsamad
      مدير تالار توابع

      • 2014/06/22
      • 1496

      #3
      نوشته اصلی توسط master
      1- توی یه ستون مثلا A با چه کدی میتونیم:
      تعداد سطر های غیر خالی رو بدست بیاریم؟(جواب یه عدد باشه)
      اولین سلول خالی شمارش چنده؟
      اخرین سلول پر شمارش چنده؟(اولین سلول خالی که بعدش دیگه سلول پر نباشه)
      در مورد قسمت دوم و سوم جواب به چه صورت هست؟ مثلا میگه سلول 50 خالی هست یا اسم خونه رو میده مثلا A50 یا ادرس افست سلول خالی رو میده (اگه اشتباه نکنم ادرس افست به صورت cell(1,50) میشه)
      اصلا میتونیم خودمون بگیم به کدوم صورت جواب بده؟
      با سلام
      برای تعداد سلولهای پر ستون A میتونید از این فرمول استفاده کنید
      کد PHP:
      =COUNTA(A:A
      برای پیدا کردن ردیف اولین سلول خالی در ستون A از این فرمولها استفاده کنید

      این فرمول رو بصورت آرایه ای وارد کنید ( یعنی بعد از نوشتن فرمول بجای ENTER از کلیدهای CTRL+SHIFT+ENTER استفاده کنید)
      کد PHP:
      =MIN(IF(A:A="";ROW(A:A))) 
      یا این فرمول
      کد PHP:
      =MATCH(TRUE;INDEX(ISBLANK(A:A);0;0);0
      برای پیدا کردن آدرس اولین سلول خالی در ستون A از این فرمول بصورت آرایه ای استفاده کنید
      کد PHP:
      =ADDRESS(MIN(IF(A:A="";ROW(A:A)));1;4
      یا از این فرمول
      کد PHP:
      =ADDRESS(MATCH(TRUE;INDEX(ISBLANK(A:A);0;0);0);1;4
      شماره ردیف آخرین سلول پر در ستون A
      کد PHP:
      =MAX(MATCH(REPT("ی";255);A:A);MATCH(9.99999999999999E+307;A:A)) 
      آدرس آخرین سلول پر در ستون A
      کد PHP:
      =ADDRESS(MAX(MATCH(REPT("ی";255);A:A);MATCH(9.99999999999999E+307;A:A));1;4
      مقدار آخرین سلول پر در ستون A
      کد PHP:
      =LOOKUP(2;1/(A:A<>"");A:A
      علاوه بر این فرمولها شما میتونید از این کد برای پیدا کردن اولین خالی در ستون A و رفتن به آن سلول استفاده کنید
      کد PHP:
      Private Sub CommandButton2_Click()
      Dim BCellNBCell
      Range
      ("A1").Select
      For 1 To 65536
      If ActiveCell.Value = Empty Then
      BCell 
      "A" CStr(1)
      NBCell "A" CStr(2)
      Exit 
      Sub
      Else
      Range("A" CStr(1)).Select
      End 
      If
      Next I
      End Sub 
      یا از این کد محدوده مورد نظر رو انتخاب کرده و جواب سلولهای خالی رو در MSGBOX نمایش میده (موقع انتخاب محدوده کل ستون رو انتخاب نکنید فقط محدوده جدول رو انتخاب کنید)
      کد PHP:
      Private Sub CommandButton1_Click()
      Dim Rng As Range
          Dim WorkRng 
      As Range
          On Error Resume Next
          xTitleId 
      "RANGE"
          
      Set WorkRng Application.Selection
          Set WorkRng 
      Application.InputBox("Range"xTitleIdWorkRng.AddressType:=8)
          For 
      Each Rng In WorkRng
              
      If Rng.Value "" Then
                  MsgBox 
      "No Value, in " Rng.Address
              End 
      If
          
      Next
      End Sub 
      [CENTER]
      [SIGPIC][/SIGPIC]
      [/CENTER]

      کامنت

      • master

        • 2010/07/18
        • 118

        #4
        سلام
        ممنون از اساتید محترم که راهنمایی کردن
        راستش من خودم یکم با کد نویسی تو اکسل اشنایی دارم حرفه ای نیستم ولی در حد اینکه کارم خودم راه بیفته اشنایی دارم
        مشکل اولم که Range متغییر بود رو اینگونه حل کردم:
        کد PHP:
        Range(Cells(ij), Cells(mn)) 
        با این دستور راحت هر جایی رو بخوام میتونم با متغییر ادرس دهی کنم البته از 4 تا متغییر برا من فقط همون i نیاز بود متغییر باشه بقیه عدد ثابت بودن

        برا بدست اوردن اخرین سلول پر هم از فرمول جناب علي پارسا با کمی تغییرات استفاده کردم که اینگونه شد:
        کد PHP:
            Dim i As Integer
            i 
        0
            Dim C 
        As Range
            
        For Each C In Range("F:F")
            If 
        IsEmpty(C.Value) = True Then
            
        Exit For
            Else
            
        1
            End 
        If
            
        Next 
        با تشکر

        کامنت

        چند لحظه..