מציאת מספרים שמרכיבים תוצאה

u333

New member
היי, קצת קפצתי עם התשבחות לפני הזמן....

ראשית, במקרה בדוגמא שהראיתי אתמול עם הקובץ שלך עבדה "פיקס"
אך, נסה, בקובץ המצורף, עם הקוד שלך, כאשר רשימת המרכיבים היא בעמודה A כמות שהיא - למצוא את מרכיבי המספר המצויין - 135858 - התשובה המתקבלת היא אפשרות אחת - A25+A27 בעוד שקיימת גם האפשרות של A27+A28
זו רק דוגמא אחת.
מעבר לכך - זמן הריצה - למספרים עם הרבה אפשרויות הוא ארוך במיוחד !!
וכל זאת אני אומר על סמך - שמצאתי בנבכי הארכיון קובץ ש'קוששתי' ברשת לפני כמה שנים ושיניתי ושיפצתי אותו - והוא רץ פי 12 עד פי 15 !!! יותר מהר וחוץ מזה - אינו מפספס אף אפשרות !
מצורפים 2 הקבצים.
נסה ב-2 הקבצים למצוא מרכיבי המספר 782644 וראה את ההבדל העצום הן בזמן הריצה - יותר מפי 10 והן במספר התוצאות - מעל 30 הפרש !
 

מיכאל אבידן

Member
מנהל
קפצת בגלל שאתה תמיד שוכח את הפתגם של חז"לינו . . .


1. זמן הריצה (במקרה של 782644) אכן גדול פי 8-10 (במקרה של 135858 הוא זהה) אבל לתוצאות של הקוד שהצעתי ניתן, למשל, להוסיף סימן שיויון כדי לבדוק את נכונות הסיכום ולהפכו לערך נומרי (אולי לעוד צרכים) בעוד ששלך מציג מס' סידוריים של מיקום הערך מבלי שניתן לעשות איתם הרבה.

2. כדי להציג, בעזרת הקוד שהצעתי, את כל
הקומבינציות האפשריות - סגור את הרשימה עם: 20^9=
 

מיכאל אבידן

Member
מנהל
וכדי שלא אחטא בשימוש בתא-עזר . . .


הוסף: 1 למס' השורה האחרונה המוחזרת לתוך המשתנה: LR.
LR = Cells(Rows.Count, 1).End(xlUp).Row + 1
 

oren1012

New member
על פניו נראה כפתרון האולטימטיבי.

לא יודע עם נהוג- אבל ניתן לקבל את הקוד בצורה שניתן יהיה להעתיק אותו?

תודה ואחלה יום
 

מיכאל אבידן

Member
מנהל
אין כל בעיה, כל עוד הקובץ שמור אצלי במחשב . . .


קוד:
Private LR, Stoper, Paid, NextRow, Num As Integer
Sub Adding()
        On Error Resume Next
        Columns(3).Clear
        Paid = [B1]
        LR = Cells(Rows.Count, 1).End(xlUp).Row
        Stoper = LR
        NextRow = 1
        Rec_comput 1, 0, 0, ""
        Columns(3).EntireColumn.AutoFit
End Sub

Sub Rec_comput(ByVal FR, SubTot, Num As Integer, Through As String)
        If FR < LR And SubTot < Paid And Num < Stoper Then
            For CurrentRow = FR To LR
                  AD = Cells(CurrentRow, 1).Address(ColumnAbsolute:=False, RowAbsolute:=False)
                  If Through <> "" Then AD = "+" & AD
                  If (SubTot + Cells(CurrentRow, 1).Value = Paid) Then
                      Cells(NextRow, 3).Value = Through + AD
                      NextRow = NextRow + 1
                  Else
                      Rec_comput CurrentRow + 1, SubTot + Cells(CurrentRow, 1).Value, Num + 1, Through + AD
                  End If
            Next
       End If
End Sub
 

oren1012

New member
ללא ידע ב VBA

תסלח לי אבל הידע שלי ב VBA כמעט ולא קיים.
לא הבנתי בדיוק את ההדגשה שלך על כך ש"קובץ" שמור אצלך במחשב- אבל אני לא יודע אם זה רלוונטי..
ניסיתי לעשות העתק הדבק לקובץ שנמצא אצלי - משום מה זה לא עובד.

זה אמור לעבוד??
תודה.
 

מיכאל אבידן

Member
מנהל
אם זה לא היה אמור לעבוד לא הייתי מציג זאת . . .


הצמד את הקובץ, שבו הדבקת את המקרו, והסבר מה וכיצד הפעלת אותו...

אנ יוצא מנקודת הנחה שטור המספרים נמצא, גם, אצלך בעמודה "A" והתא המציג את הסה"כ הוא תא B1.
 

oren1012

New member
תודה

כבר משכתי את הקוד שלך בתוך קובץ ממה שעשה u333.
תודה גם לו..

בכל מקרה מבדיקה קצרה הקובץ מוגבל מאוד לכמות מאוד קטנה של נתונים. לא לעשרות ובטח לא למאות (מה שדי הגיוני- ובכל זאת..)

לסיכום העניין אין מנוס מלעשות דברים בצורה ידנית.

תודה.
 

oren1012

New member
חשבתי שהייתי די ברור

מצ"ב קובץ עם בסך הכל 50 שורות.
אצלי לפחות הוא לא מצליח לרוץ..
 

מיכאל אבידן

Member
מנהל
אתה ממהר לאן שהוא
. . .


בכוונה הצגתי את הנוסחה בה מרכיביה הם תוצאות ריצת המקרו ולא באמצעות Evaluate כדי לחסוך בהתדיינות נוספת.

לתחושתי - זו היתה 'שאלה קנטרנית' כי כפי שכבר צויין, סכום מוגדר יכול שיהיה מורכב מתשלומים של מספר לקוחות שונים (ראה תוצאות בתמונה) וככזה לא ישקף את מה שאתה, כביכול, מחפש ("יש לי הכנסה מסויימת ואני רוצה לדעת מאלו לקוחות אותו סכום הגיע").

אני סיימתי את שהיה לי לומר בדיון הזה.

 

u333

New member
לי יש רק להוסיף כמה דברים.....

כבר התרעתי פעמיים בפתיל זה על מספר האפשרויות הרב שהולך וגדל עם גידול מס. המרכיבים

למשל, בדוגמא שבקובץ האחרון שהעלית, זה עם 50 המרכיבים - הכנסתי את הנתון לקובץ עם הקוד שלי, המהיר - ואלו התוצאות:
קיבלתי לא פחות מ- 1715 אפשרויות
- אתה קולט ? - 1715
זמן הריצה - אצלי - (שהוא מהיר יותר מפי 12 מאשר בקוד של מיכאל) - 14.5 דקות
(את זה של מיכאל לא ניסיתי - לא היתה לי סבלנות לחכות)
אך, אם זה מעניין אותך - בקוד שאני הצעתי - ניתן לבקש מספר מוגבל של אפשרויות - החל מאפשרות אחת בלבד, עד למספר המכסימלי.
לדוגמא:
  • אפשרות אחת בלבד - 4.5 שניות
  • 2 אפשרויות - כ-5.5 שניות
  • 5 אפשרויות - כ-6.5 שניות
  • 10 אפשרויות - כ-7.5 שניות.
  • 25 אפשרויות - כ-13 שניות
  • 100 אפשרויות - כבר עובר את הדקה !
לסיכום - אני לא הייתי בונה מערכת הנה"ח ומעקב אחרי תשלומים על מודל כזה.
 

ziv98

Member
אתה צודק

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

אתה מוזמן לבקר אצלי ולראות איך מערכת מתמודדת עם מאות מיליוני רשומות.
 
למעלה