אופטימיזיות קוד ב-VBA

pinkys brain1

New member
אופטימיזיות קוד ב-VBA

שלום לכולם.
קראתי דף של מייקרוסופט שמסביר איך אפשר לייעל קודי VBA, ואחת ההצעות הייתה להשתמש כמה שפחות במעברים בין worksheets ולבצע הראשית הקוד העתקה למערך datarange, לדוגמא:
קוד:
Dim DataRange As Variant

  ' Read all the values at once from the Excel grid and put them into an array.
  DataRange = Range("A1:C10000").Value2

לבצע את הפעולות בין הטבלאות ובסוף להעתיק חזרה את הנתונים ל-worksheet הרלוונטי.
מספר שאלות:

א. האם הפרוצדורה הזאת מעתיקה את נתוני הטבלה בדיוק באותו סדר שבה הערכים מופיעים בגיליון המקורי?
ב. האם ההמלצה תקפה גם אם יש לי, נניח, 3 גיליונות שונים - שבכל גיליון יש טבלאות, ואני צריך לבצע חיתוכים והשוואות בין הטבלאות השונות? (כלומר, לעשות את כל החיתוכים וההשוואות בין מערך a למערך b במקום בין גיליון 1 לבין גיליון 2, ואז להעתיק את נתוני "מערך a" לטבלת היעד הסופית שלי?)
ג. מתי רצוי להשתמש במערך כזה? (כלומר, אם יש לי טבלה שיש בה מעל כמה שורות ומעל כמה עמודות?)
ד. האם ניתן לחתוך נתונים ממערך ולהעתיק חזרה רק חלק ממנה? (לדוגמא, להעתיק מהגיליון המקורי 3 עמודות, לעשות בעמודה השלישית כל מיני חישובים, ואז להחזיר לגיליון המקורי רק את העמודה השלישית (כי בעמודה 1,2 לא השתנה כלום מההעתקה המקורית)?
ה. האם אפשר להשתמש בפונקציות כמו ,,index, vlookup,countifs וכו' על המערך הזה? או שכל פונקציה צריך לממש בקוד עצמו?
תודה וסוף שבוע מעולה!
 

iyyi

New member
תשובות

א. כן. אם העתקת את התחום A1:C3 למערך בשם DataArray אז:
DataArray(1,1)=A1
DataArray(2,3)=C2 וכן הלאה
המערך במקרה הזה הוא מעין טבלה דו מימדית עם מספר שורה ועמודה המקבילים לשורות ועמודות בגיליון

ב. אתה יכול ליצור מספר מערכים מגיליונות שונים. החיסכון הגדול בזמן נוצר כאשר אתה קורא בבת אחת הרבה נתונים וכותב אותם לגיליון בפעם אחת. אם אתה קורא נתון מהגיליון, מבצע חישוב, כותב את התוצאה ואז קורא את התא הבא וחוזר חלילה, זה מבזבז זמן.

ג. ככל שהטבלה גדולה יותר היעילות תגדל. יש לך מספיק זיכרון זמין להרבה נתונים.

ד. יש דרך להעתיק חלק ממערך לגיליון. אתה עושה זאת באמצעות פונקציית INDEX (ב-VBA זה Application.Index). המקרו הבא יעתיק את התחום A1:C3 למערך בשם DataArray, לאחר מכן יעתיק את העמודה השנייה במערך לתאים D1:D3
קוד:
Sub test()
DataArray = Range("A1:B3")
Range("D1:D3") = Application.Index(DataArray, 0, 2)
End Sub
 

pinkys brain1

New member
תודה רבה על המענה!


 
למעלה