לופּס אין VBA

עס זענען סיטואַטיאָנס ווען אַ וובאַ פּראָגראַם איז פארלאנגט צו דורכפירן די זעלבע גאַנג פון אַקשאַנז עטלעכע מאָל אין אַ רודערן (דאָס איז, איבערחזרן די זעלבע בלאָק פון קאָד עטלעכע מאָל). דעם קענען זיין געטאן מיט VBA לופּס.

VBA לופּס אַרייַננעמען:

ווייַטער, מיר וועלן נעמען אַ נעענטער קוק אין יעדער פון די סייקאַלז.

פֿאַר לופּ אָפּעראַטאָר אין וויסואַל באַסיק

די סטרוקטור פון די שלייף אָפּעראַטאָר די אין וויסואַל באַסיק קענען זיין אָרגאַניזירט אין איינער פון צוויי פארמען: ווי אַ שלייף פֿאַר ... ווייַטער אָדער ווי אַ שלייף פֿאַר יעדער.

ציקל "פֿאַר ... ווייַטער"

ציקל פֿאַר ... ווייַטער ניצט אַ בייַטעוודיק וואָס סאַקווענטשאַלי נעמט וואַלועס פון אַ געגעבן קייט. מיט יעדער טוישן פון די ווערט פון די בייַטעוודיק, די אַקשאַנז ענקלאָוזד אין די גוף פון די ציקל זענען דורכגעקאָכט. דאָס איז גרינג צו פֿאַרשטיין פֿון אַ פּשוט בייַשפּיל:

פֿאַר איך = 1 צו 10 גאַנץ = גאַנץ + יאַררייַ (איך) ווייַטער איך

אין דעם פּשוט שלייף פֿאַר ... ווייַטער בייַטעוודיק איז געניצט i, וואָס סאַקווענטשאַלי נעמט די וואַלועס 1, 2, 3, ... 10, און פֿאַר יעדער פון די וואַלועס, די וובאַ קאָד אין די שלייף איז עקסאַקיוטאַד. אזוי, דעם שלייף סאַמז די יסודות פון די מענגע. iArray אין בייַטעוודיק גאַנץ.

אין די אויבן בייַשפּיל, די שלייף ינקראַמאַנט איז נישט ספּעסיפיעד, אַזוי צו ינקראַמאַנט די בייַטעוודיק i פון 1 צו 10, די פעליקייַט איז אַ ינקראַמאַנט 1... אָבער, אין עטלעכע קאַסעס עס איז נייטיק צו נוצן פאַרשידענע ינקראַמאַנט וואַלועס פֿאַר די שלייף. דאָס קען זיין געטאן מיט די קיווערד טרעטןווי געוויזן אין די פאלגענדע פּשוט בייַשפּיל.

פֿאַר ד = 0 צו 10 שריט 0.1 דטאָטאַל = דטאָטאַל + ד ווייַטער ד

זינט אין די אויבן בייַשפּיל, די ינקראַמאַנט שריט איז באַשטימט גלייַך צו 0.1, דעמאָלט דער בייַטעוודיק dTotal פֿאַר יעדער יבערכאַזערונג פון די ציקל נעמט די וואַלועס 0.0, 0.1, 0.2, 0.3, ... 9.9, 10.0.

צו באַשטימען די שלייף שריט אין VBA, איר קענען נוצן אַ נעגאַטיוו ווערט, למשל, ווי דאָס:

פֿאַר איך = 10 צו 1 שריט -1 iArray (i) = איך ווייַטער איך

דאָ די ינקראַמאַנט איז -1, אַזוי די בייַטעוודיק i מיט יעדער יבערכאַזערונג פון די ציקל נעמט די וואַלועס 10, 9, 8, ... 1.

שלייף "פֿאַר יעדער"

ציקל פֿאַר יעדער ענלעך צו אַ ציקל פֿאַר ... ווייַטער, אָבער אַנשטאָט פון יטערייטינג די סיקוואַנס פון וואַלועס פֿאַר די טאָמבאַנק בייַטעוודיק, די שלייף פֿאַר יעדער פּערפאָרמז אַ סכום פון אַקשאַנז פֿאַר יעדער כייפעץ אין די ספּעסיפיעד גרופּע פון ​​​​אַבדזשעקץ. אין די פאלגענדע בייַשפּיל, ניצן אַ שלייף פֿאַר יעדער ינומערייץ אַלע שיץ אין דעם קראַנט עקססעל וואָרקבאָאָק:

דיק ושעעט ווי וואָרקשעעט פֿאַר יעדער ושעעט אין וואָרקשעעץ MsgBox "Найден лист: " & wSheet.Name ווייַטער wSheet

שלייף יבעררייַס ויסזאָגונג "אַרויסגאַנג פֿאַר"

אָפּעראַטאָר אַרויסגאַנג פֿאַר געוויינט צו יבעררייַסן די ציקל. ווי באַלד ווי די דערקלערונג איז געפּלאָנטערט אין די קאָד, די פּראָגראַם ענדס די דורכפירונג פון די שלייף און לייזונג צו דער דורכפירונג פון די סטייטמאַנץ וואָס זענען אין די קאָד גלייך נאָך דעם שלייף. דעם קענען זיין געוויינט, פֿאַר בייַשפּיל, צו זוכן פֿאַר אַ ספּעציפיש ווערט אין אַ מענגע. צו טאָן דאָס, מיט אַ שלייף, יעדער עלעמענט פון די מענגע איז סקאַנד. ווי באַלד ווי די פארלאנגט עלעמענט איז געפונען, עס איז ניט דאַרפֿן צו קוקן דורך די מנוחה - די ציקל איז ינטעראַפּטיד.

אָפּעראַטאָר אַפּלאַקיישאַן אַרויסגאַנג פֿאַר דעמאַנסטרייטיד אין די פאלגענדע בייַשפּיל. דאָ די שלייף יטערייץ איבער 100 מענגע איינסן און קאַמפּערז יעדער מיט די ווערט פון די בייַטעוודיק דוואַל... אויב אַ גלייַכן איז געפֿונען, דער שלייף איז טערמאַנייטיד:

פֿאַר איך = 1 צו 100 אויב דוואַלועס (איך) = דוואַל דעמאָלט ינדעקסוואַל = איך אַרויסגאַנג פֿאַר סוף אויב ווייַטער איך

די טאָן בשעת שלייף אין וויסואַל באַסיק

ציקל טאָן בשעת עקסאַקיוץ אַ בלאָק פון קאָד ווי לאַנג ווי די ספּעסאַפייד צושטאַנד איז באגעגנט. די פאלגענדע איז אַ בייַשפּיל פון אַ פּראָצעדור סאַב, אין וואָס ניצן די שלייף טאָן בשעת פיבאָנאַקסי נומערן ניט יקסיד 1000 זענען געוויזן סאַקווענטשאַלי:

'סאַב פּראָצעדור אַוטפּוץ Fibonacci נומערן נישט יקסיד 1000 Sub Fibonacci () Dim i As Integer 'טאָמבאַנק צו אָנווייַזן די שטעלע פון ​​​​דעם עלעמענט אין די סיקוואַנס Dim iFib As Integer 'סטאָרז די קראַנט ווערט פון די סיקוואַנס Dim iFib_Next As Integer 'סטאָרז די ווייַטער ווערט פון די סיקוואַנס Dim iStep As Integer 'סטאָרז די גרייס פון ווייַטער ינקראַמאַנט' ינישאַליזע וועריאַבאַלז איך און iFib_Next i = 1 iFib_Next = 0 'צי בשעת שלייף וועט ויספירן ביז די ווערט פון' קראַנט פיבאָנאַקסי נומער איז גרעסער ווי 1000 צי בשעת iFib_Next <1000 אויב איך = 1 דעמאָלט 'ספּעציעל פאַל פֿאַר ערשטער עלעמענט iStep = 1 iFib = 0 אַנדערש 'היט די גרייס פון דער ווייַטער ינקראַמאַנט איידער אָווועררייטינג 'די קראַנט ווערט פון די סיקוואַנס iStep = iFib iFib = iFib_Next סוף אויב 'דרוק די קראַנט Fibonacci נומער אין זייַל א פון די אַקטיוו ווערקשיט 'אין די רודערן מיט אינדעקס איך סעללס (איך, קסנומקס). ווערט = יפיב 'רעכענען די ווייַטער פיבאָנאַקסי נומער און ינקראַמאַנט די עלעמענט שטעלע אינדעקס דורך 1 iFib_Next = iFib + iStep i = איך + 1 לופּ סוף סוב

אין דעם געגעבן בייַשפּיל, די צושטאַנד iFib_Next <1000 אָפּגעשטעלט אין די אָנהייב פון די שלייף. דעריבער, אויב דער ערשטער ווערט iFib_Next אויב עס זענען געווען מער ווי 1000, די שלייף וואָלט קיינמאָל זיין עקסאַקיוטאַד.

אן אנדער וועג צו ינסטרומענט אַ שלייף טאָן בשעת - שטעלן די צושטאַנד ניט אין די אָנהייב, אָבער אין די סוף פון די שלייף. אין דעם פאַל, די שלייף וועט זיין עקסאַקיוטאַד בייַ מינדסטער אַמאָל, ראַגאַרדלאַס פון צי די צושטאַנד איז באגעגנט.

סכעמאַטיש, אַזאַ אַ ציקל טאָן בשעת מיט די צושטאַנד צו זיין אָפּגעשטעלט אין די סוף וועט קוקן ווי דאָס:

טאָן ... שלייף בשעת iFib_Next <1000

בילד «טאָן ביז» אין וויסואַל באַסיק

ציקל טאָן ביז זייער ענלעך צו ציקל טאָן בשעת: דער בלאָק פון קאָד אין די גוף פון די שלייף איז עקסאַקיוטאַד איבער און איבער ווידער ביז די ספּעסיפיעד צושטאַנד איז באגעגנט (דער רעזולטאַט פון די קאַנדישאַנאַל אויסדרוק איז ריכטיק). אין דער ווייַטער פּראָצעדור סאַב ניצן אַ ציקל טאָן ביז צוריקקריגן וואַלועס פון אַלע סעלז אין אַ זייַל A ווערקשיט ביז דער זייַל ינקאַונטערז אַ ליידיק צעל:

iRow = 1 Do Until IsEmpty (Cells (iRow, 1)) 'די ווערט פון די קראַנט צעל איז סטאָרד אין די מענגע dCellValues ​​dCellValues ​​(iRow) = סעלז (יראָוו, 1). ווערט iRow = iRow + 1 לופּ

אין דעם בייַשפּיל אויבן, די צושטאַנד IsEmpty(Cells(iRow, 1)) ליגן אין די אָנהייב פון די סטרוקטור טאָן ביז, אַזוי די שלייף וועט זיין עקסאַקיוטאַד בייַ מינדסטער אַמאָל אויב דער ערשטער צעל גענומען איז נישט ליידיק.

אָבער, ווי געוויזן אין די שלייף ביישפילן טאָן בשעת, אין עטלעכע סיטואַטיאָנס עס איז נייטיק אַז די שלייף איז עקסאַקיוטאַד בייַ מינדסטער אַמאָל, ראַגאַרדלאַס פון די ערשט רעזולטאַט פון די קאַנדישאַנאַל אויסדרוק. אין דעם פאַל, די קאַנדישאַנאַל אויסדרוק זאָל זיין געשטעלט אין די סוף פון די שלייף, ווי דאָס:

צי ... שלייף ביז איז עמפּטי (סעלז (יראָוו, 1))

לאָזן אַ ענטפֿערן