בקשה | בדיקה אצל הרב GPT
-
@יהודי-זה-הכי
שאלתי את GPT, וזלה"ק:הבעיה בקוד שלך נובעת מכמה סיבות. הנה כמה נקודות שיכולות לגרום לבעיות:
-
שימוש לא נכון ב-GoTo: השימוש ב-GoTo מיותר, ומבצע מעבר חוזר למקום לא ברור אם המשתמש בוחר ב-No בהודעת ה-MsgBox. כדאי לשקול לעצב את הלוגיקה באופן פחות תלוי ב-GoTo, למשל עם לולאה.
-
משתנה a לא מוגדר: אתה משתמש ב-a כמשתנה שיקבל את הערך מה-InputBox, אך לא הגדרת אותו לפני השימוש. כדאי להוסיף הגדרה של המשתנה a בתחילת הקוד, לדוגמה:
Dim a As String
-
טעויות בלוגיקת ה-If: השימוש ב-If a = vbNo ו-If a = vbYes לא מוגן כראוי. אתה לא צריך להשוות את הערך של a ל-vbYes או vbNo אלא לבדוק את הערך שהמשתמש הזין.
-
טעויות ב-Exit Sub: ה-Exit Sub נמצא בתוך בלוק ה-If, כך שהוא יפסיק את הריצה של הסאב-פרוצדורה לפני שהקוד יוכל להגיע למקום שדורש המשך.
הנה גרסה מתוקנת של הקוד:
Sub שם_מוכר() Sheets("נתונים").Select Range("H1").Select Selection.Copy Sheets("נתונים").Select Range("H11").Select ActiveSheet.Paste sta: Dim a As String Dim m As Integer a = InputBox("!!!הזן את שם המוכר החדש", "מוכר", Sheets("נתונים").Range("H1").Value) If a = "" Then m = MsgBox("שים לב לא הוזן שם מוכר! לנסות שוב?", vbYesNo) If m = vbNo Then Exit Sub ElseIf m = vbYes Then GoTo sta End If Else Sheets("נתונים").Select Range("H11").Select Selection.Copy Sheets("נתונים").Select Range("H1").Select ActiveSheet.Paste End If End Sub
ההסברים לשינויים:
-
הוספתי את הגדרת המשתנה a כמשתנה מסוג String.
-
הפכתי את השוואת התשובה ל-MsgBox לנכונה (יש להשוות את הערך של m ל-vbYes או vbNo ולא את a).
-
הוספתי בלוק שיטפל במקרה של הזנת שם, אם המשתמש לא הזין שם, הקוד יחזור על עצמו עם GoTo sta אם יבחר כן, או יצא מהסאב-פרוצדורה אם יבחר לא.
נסה את הקוד הזה וראה אם זה פותר את הבעיה!
-
-
@יוסף-אלחנן לא פתר
-
@יהודי-זה-הכי אני לא מבין בזה!
אתה רוצה שנמשיך כמו תוכי?
-
@יוסף-אלחנן כן
אני פחות או יותר מבין מה הוא התכוון
תודה רבה -
@יהודי-זה-הכי
יאללה, בוא נעשה סדר ונסדר לך את זה ברור ובריא בלי GoTo, בלי Select ובלי Copy מיותר — כמו שכותבים קוד נכון ב־VBA.הנה גרסה פשוטה, נקייה, שעושה בדיוק מה שאתה רוצה:
מה הקוד עושה?
לוקח את הערך מ־H1 ושם אותו ב־H11.פותח תיבת קלט למשתמש להזין שם מוכר.
אם המשתמש לא מזין כלום, שואל אם לנסות שוב.
אם בחר "לא" — מחזיר את השם הישן מ־H11 ל־H1 ויוצא.
אם בחר "כן" — מחזיר שוב ל־InputBox עד שיזין משהו.
קוד מתוקן ונקי:
Sub שם_מוכר() Dim ws As Worksheet Dim a As String Dim m As VbMsgBoxResult Set ws = ThisWorkbook.Sheets("נתונים") ' שמירת שם קודם ws.Range("H11").Value = ws.Range("H1").Value Do a = InputBox("!!!הזן את שם המוכר החדש", "מוכר", ws.Range("H1").Value) If a = "" Then m = MsgBox("שים לב! לא הוזן שם מוכר. לנסות שוב?", vbYesNo + vbExclamation) If m = vbNo Then ' מחזיר את השם הישן ws.Range("H1").Value = ws.Range("H11").Value Exit Sub End If Else ws.Range("H1").Value = a Exit Sub End If Loop End Sub
למה זה עובד טוב:
בלי .Select (לא צריך ב־VBA, זה סתם מאט ומכביד)
בלי .Copy (אפשר להעביר ערכים פשוט דרך .Value)
בלי GoTo (משתמשים בלולאה Do...Loop, הרבה יותר נכון ונקי)
מבנה ברור, קריא ויעיל
ע"כ לה"ק.
מכאן ואלך, זה אנוכי הקטן, הנני עייף ותנומה נופלת על עפעפי,
חפש לך פרייאר אחרסתם, עוד מעט מישהו אחר יגיע לעזור לך בשיחה הזו...
-
@יוסף-אלחנן הסתדר ברוך ה'
הייתי מת להפציץ לך לייקים אבל אני לא יכול לתת אפילו 1אם לא תעזור לי להגיע ל10
בעזרת ה' כשנגיע ל10 נזכור אותךבכל מקרה תודה רבה ענקית
-
יש פה עוד מישהו בשביל לעזור לי שניה?
-
@יהודי-זה-הכי כתב בבקשה | בדיקה אצל הרב GPT:
יש פה עוד מישהו בשביל לעזור לי שניה?
תנסה יש לי חצי דקה
-
Sub שם_מוכר() 'הסתר פעולות עד לסיום המאקרו (מונע שגיאות) Application.ScreenUpdating = False Dim ws As Worksheet Dim a As String Dim m As VbMsgBoxResult Set ws = ThisWorkbook.Sheets("נתונים") ' שמירת שם קודם ws.Range("H11").Value = ws.Range("H1").Value Do a = InputBox("!!!הזן את שם המוכר החדש", "מוכר", ws.Range("H1").Value) If a = "" Then m = MsgBox("שים לב! לא הוזן שם מוכר. לנסות שוב?", vbYesNo + vbExclamation) If m = vbNo Then ' מחזיר את השם הישן ws.Range("H1").Value = ws.Range("H11").Value Exit Sub End If Else ws.Range("H1").Value = a Exit Sub End If Loop End Sub
שיוסיף שבהקשה על ביטול ייצא ישר מהמאקרו
-
@יהודי-זה-הכי כתב בבקשה | בדיקה אצל הרב GPT:
שיוסיף שבהקשה על ביטול ייצא ישר מהמאקרו
בקשתך מצוינת!
הכפתור "ביטול" ב-InputBox מחזיר vbNullString (כלומר ""), לכן הוא מתנהג כמו ריק — אבל אפשר לבדוק אם המשתמש לחץ על ביטול ע"י שימוש ב־StrPtr(a) = 0 (טריק ותיק ב־VBA שמזהה ביטול).הנה הגרסה שלך משודרגת, כך שאם המשתמש לוחץ ביטול, המאקרו ייצא מיד — בלי לשאול שוב:
קוד מתוקן:
Sub שם_מוכר() ' הסתר פעולות עד לסיום המאקרו Application.ScreenUpdating = False Dim ws As Worksheet Dim a As String Dim m As VbMsgBoxResult Set ws = ThisWorkbook.Sheets("נתונים") ' שמירת שם קודם ws.Range("H11").Value = ws.Range("H1").Value Do a = InputBox("!!!הזן את שם המוכר החדש", "מוכר", ws.Range("H1").Value) ' אם המשתמש לחץ על ביטול - יציאה If StrPtr(a) = 0 Then Exit Sub End If If a = "" Then m = MsgBox("שים לב! לא הוזן שם מוכר. לנסות שוב?", vbYesNo + vbExclamation) If m = vbNo Then ' מחזיר את השם הישן ws.Range("H1").Value = ws.Range("H11").Value Exit Sub End If Else ws.Range("H1").Value = a Exit Sub End If Loop End Sub
🟢 מה נוסף פה?
השורה:
If StrPtr(a) = 0 Then Exit Sub
בודקת אם המשתמש לחץ על ביטול ויוצאת מיידית מהמאקרו.
אם תרצה, אפשר גם להחזיר הודעה קטנה שמעדכנת: "הפעולה בוטלה" או "השם עודכן בהצלחה".
רוצה שאוסיף את זה?זלשוה"ק