תשובה
מכיוון שעל מערך חובה להכריז בגודל קבוע, לא ניתן להגדיר אותו כתלוי במספר הפריטים ברשימה. מה שבכל זאת אפשר לעשות הוא להגדיר מערך בעל גודל לא ידוע מראש. הגדרה כזו לא מאפשרת גישה לכל אלמנט במערך ולכן לא ניתן להציב בו ערכים באופן ישיר ע"י ציון אינדקס. הדרך היחידה (כמעט) להצבה במערך כזה היא ע"י פונקציית פיצול (Split) אשר חותכת מחרוזת ארוכה לחלקים ע"י ציון ה-'חוצץ' והצבתם במערך המדובר. לכן נכריז על מערך בעל גודל לא ידוע וניתן לפונקצית הפיצול (Split) לקבוע את גודלו ע"י פיצול מחרוזת ארוכה שתהווה שרשור של כל הפריטים ברשימה עם חוצץ בין כל פריט לפריט. ניקח לדוגמה את החוצץ ";" (חובה לבחור חוצץ שאינו מופיע כחלק מאף פריט, לכן אם הסימן קיים באחד הפריטים ברשימה יש לבחור חוצץ אחר במקומו), ונשרשר את הפריטים יחד למחרוזת אחת. לדוגמה:
alef;bet;gimel;dalet
נשים לב שהחוצץ, כשמו כן הוא, מופיע רק בין שני פריטים ולא בהתחלה או בסוף. פונקציית הפיצול תחפש את החוצץ ותפצל את המחרוזת לחלקים לפיו. כעת ניתן להבין את הקוד ואת דרך פעולתו:
Private Sub cmdAssemble_Click() Const SEPARATOR As String = ";" 'set separator string constant Dim itemsArray() As String 'declare on a dynamic array Dim strItems As String Dim i As Integer 'chain all items into a long string separated by ";" For i = 0 To lstRec.ListCount - 1 strItems = strItems & SEPARATOR Next i If (lstRec.ListCount > 0) Then 'if there are items strItems = Left$(strItems, Len(strItems) - 1) 'cut last separator End If 'if there were no items at all, array will be empty itemsArray = Split(strItems, SEPARATOR) 'split the long string to array End Sub
בסוף הפרוצדורה ניתן לעבור באופן רציף על איברי המערך ע"י שימוש בפונקציות LBound ו-UBound המחזירות את האינדקס הראשון והאחרון (בהתאמה) במערך ולולאה פשוטה.