אקסס - קוד VBA לחיפוש והחלפה
-
שלום וברכה,
אני צריך קוד VBA שיוכל לעשות באופן אוטומטי את הפעולה שעושה הלחצן של חיפוש והחלפה המובנה באופיס.
אבל, אני צריך:- שהוא יעבוד דווקא על שדה מסויים בטבלה מסויימת.
- שהוא לא יעבוד אוטומטית אלא שאני אצטרך להריץ אותו. (עדיף שיהיה לי לחצן באיזשהו טופס, אבל אפשר גם דרך עורך הVBA)
- שהוא יחליף לפי סדר מסויים. (דהיינו אני רוצה שאת סדרת המספרים 1-20 הוא יחליף כל מספר לאות, 1-א, 2-ב וכן הלאה. אם הוא יתחיל מ-1 הוא יחליף לי את 11 ל-אא, לכן אני צריך שהוא יתחיל מ20 וירד כלפי מטה).
- אם יש אפשרות (לא חובה): שאת הנתונים מה להחליף הוא יקבל מטבלה אחרת בקובץ. דהיינו, אם יש לי טבלה כזו:
שהקוד ידע שאת מה שבשדה הראשון להחליף במה שבשדה השני.
אשמח לדעת אם יש אופציה כזו, ואיך.
תודה רבה מאוד! -
@איש-פלוני אמר באקסס - קוד VBA לחיפוש והחלפה:
הוא יחליף לי את 11 ל-אא, לכן אני צריך שהוא יתחיל מ20 וירד כלפי מטה).
למה לא שאילתת עדכון? אתה מביא את 2 הטבלאות הנ"ל (1. הטבלה של המספרים והאותיות, 2. הטבלה שבה אתה רוצה להחליף)
מוסיף קריטריון שהמספר בטבלה שאתה רוצה להחליף = המספר בטבלה של האותיות, ומעדכן את המספר לאותית,
רק שים לב שכדאי שהכל יהיה בעיצוב של string - או שתשתמש בהחלפה ע"י Cstr() או Clng() -
@avi-rz כי עדכון יחליף לי את כל מה שבשדה. אני רוצה שאם בשדה כתוב
1 XXX
זה יהפוך לא XXX
ולא רק לא
. -
@איש-פלוני תוכל להשתמש בשאילתת עדכון ולשמור את הערך הקיים, פשוט תבצע Replace על הערך הקיים, כלומר למשל על השדה SomeField תעדכן ל:
Replace([SomeField],'1','א')
או בשימוש עם טבלת עזר MyTable כמו שציין @avi-rz, ותשלוף את הערכים משם:
Replace([SomeField], MyTable.OldValue, MyTable.NewValue)
-
@איש-פלוני בשאילתת עדכון אתה יכול לכתוב Replace. בקיצור זה פתרון מצויין,
אבל כדאי שתביא דוגמת נתונים קטנה כדי שיהיה קל להסביר. -
@dovid
יש לי טבלה בשם kategoryot בה יש IDkategoria (קוד קטגוריה), ו- name
ככה:
יש לי טבלה נפרדת בשם katalogM שבה יוצא בשדה kategHeara ככה:
אני רוצה שיחליף לי רק את המספרים, כל מספר לפי הקטגוריה השייכת אליו.
תודה רבה! -
@odeddvir אמר באקסס - קוד VBA לחיפוש והחלפה:
או בשימוש עם טבלת עזר MyTable כמו שציין @avi-rz, ותשלוף את הערכים משם:
Replace([SomeField], MyTable.OldValue, MyTable.NewValue)יש אפשרות להגדיר לו לפי איזה סדר הוא יחליף?
אחרת חוזרת הבעיה שכתבתי:@איש-פלוני אמר באקסס - קוד VBA לחיפוש והחלפה:
אם הוא יתחיל מ-1 הוא יחליף לי את 11 ל-אא, לכן אני צריך שהוא יירד כלפי מטה.
-
@odeddvir אמר באקסס - קוד VBA לחיפוש והחלפה:
@איש-פלוני תוכל להשתמש בשאילתת עדכון ולשמור את הערך הקיים, פשוט תבצע Replace על הערך הקיים, כלומר למשל על השדה SomeField תעדכן ל:
Replace([SomeField],'1','א')
אני יכול להגדיר לו כמה נתונים להחלפה (דהיינו,
Replace([SomeField],'1','א')
, וReplace([SomeField],'2','ב')
) ? כשניסיתי לעשות שאילתה שבכל אחד מהשדות אותה פונקציה עם נתונים שונים זה מעלה לי הודעת שגיאה על כפילות ביעד הפלט.
תודה רבה! -
@איש-פלוני אני מציע לך דרך פשוטה יותר:
א. צור טבלה להחלפה עם עמודות כדלקמן:OldValue NewValue 1 א 2 ב ... 19 יט 20 כ ב. תבודד את המספר מהשדה המקורי אל שדה נפרד X על ידי מניפולציה על המחרוזת.
ג. קשר את הטבלאות על ידי השדות X-OldValue
ד. תריץ שאילתת עדכון שתחליף בין הערך המספרי בשדה המקורי לערך NewValue:Replace([SomeField],OldValue, NewValue)
-
@odeddvir אמר באקסס - קוד VBA לחיפוש והחלפה:
ב. תבודד את המספר מהשדה המקורי אל שדה נפרד X על ידי מניפולציה על המחרוזת.
ג. קשר את הטבלאות על ידי השדות X-OldValueלא הבנתי מה אני צריך לעשות ואיך...
השדה הנפרד הוא בטבלה נוספת? "השדה המקורי" הכוונה לטבלה החדשה שיצרתי עכשיו? איך עושים מניפולציה על המחרוזת? -
@איש-פלוני ראשית כל אתה צריך להצליח לתשאל את הkatalogM באופן שמחלץ את המספר:
SELECT Mid([kategHeara],1,InStr([kategHeara],".")-1) as מניפולציה, kategHeara FROM katalogM
תראה אם זה מוציא לך טוב את המספר.
שלב שני זה לעשות מה ש@OdedDvir הציע. -
@dovid לא עובד. (שגיאת תחביר אופרטור חסר בביטוי השאילתה).
המילה מניפולציה באמצע? ככה? -
@איש-פלוני תואיל להדביק פה את לשון השאילתה אחרי השינויים שעשית.
-
@איש-פלוני
או שתחלץ את המספר עם הפונקציה הזאת. (בהנחה שאין עוד מספרים בשדה)Public Function GetNumerals(str As String) As String Dim i As Integer For i = 1 To Len(str) If IsNumeric(Mid(str, i, 1)) Then GetNumerals = GetNumerals & Mid(str, i, 1) End If Next i End Function
-
@dovid העתקתי את מה שכתבת לתוך שאילתה בתצוגה של SQL וזהו...
-
@איש-פלוני חסר פרמטר אחד בקוד של @dovid , צ"ל:
SELECT Mid([kategHeara],1,InStr(1,[kategHeara],".")-1) as מניפולציה, kategHeara FROM katalogM
(עריכה: מה שכתבתי לעיל שגוי, עיין בהערת @dovid לקמן)
-
@odeddvir זה אופציונלי.
-
@dovid אמר באקסס - קוד VBA לחיפוש והחלפה:
זה אופציונלי.
נכון, אבל צריך לכל הפחות להשמיט ולהשאיר מקום ריק, כך:
SELECT Mid([kategHeara],1,InStr(,[kategHeara],".")-1) as מניפולציה, kategHeara FROM katalogM
-
@odeddvir לא צריך, אופציונלי זה אומר שניתן פשוט לדלג עליו לגמרי.
הוא מזהה את הארגומנט נכון לפי מספר הארגומנטים (2). -
בס"ד
אולי יעזור לך:
הקוד להלן הוא ממיר מחזיר גימטריה ממספר לאותיות - ומאותיות למספר, זה נכון עד למספר 499 ו אותיות עד תצט,
אפשר להוסיף - זה פשוט קוד ישן שלי.Public Function GetGimatryya(str_ As Variant) As Long Dim i As Long Dim longht_ As Long Dim Y As Long Dim out As Long Dim str_to_out As String longht_ = Len(Nz(str_, "")) For i = 1 To longht_ str_to_out = Mid(str_, i, 1) Select Case str_to_out Case "א", "ב", "ג", "ד", "ה", "ו", "ז", "ח", "ט", "י", "כ", "ל", "מ", "נ", "ס", "ע", "פ", "צ", "ק", "ר", "ש", "ת", "ך", "ם", "ן", "ף": Y = Asc(str_to_out) - 223 Case Else Y = 0 End Select arr_ = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 20, 30, 40, 40, 50, 50, 60, 70, 80, 80, 90, 90, 100, 200, 300, 400) out = Nz(out, 0) + arr_(Y) Next i GetGimatryya = out End Function Public Function GetGimatryyaStr(str_ As Variant) As String Dim i As Long Dim longht_ As Long Dim Y As Long Dim out As String Dim str_to_out As Long longht_ = Len(Nz(str_, "")) arr_ = Array("", "א", "ב", "ג", "ד", "ה", "ו", "ז", "ח", "ט", "י", "י", "כ", "ל", "מ", "נ", "ס", "ע", "פ", "צ", "ק", "ק", "ר", "ש", "ת") For i = 1 To longht_ Select Case (longht_ + 1) - i Case 1: str_to_out = CLng(IIf(Nz(Mid(str_, i, 1), "") = "", 0, Mid(str_, i, 1))) out = Nz(out, 0) + arr_(str_to_out) Case 2: str_to_out = CLng(IIf(Nz(Mid(str_, i, 1), "") = "", 0, Mid(str_, i, 1))) out = Nz(out, 0) + arr_(str_to_out + 10) Case Else str_to_out = CLng(IIf(Nz(Mid(str_, i, 1), "") = "", 0, Mid(str_, i, 1))) out = Nz(out, 0) + arr_(str_to_out + 20) End Select Next i GetGimatryyaStr = out End Function
אפשר לנסות
Debug.Print GetGimatryya("רמח") Debug.Print GetGimatryyaStr(499)
-
@dovid אמר באקסס - קוד VBA לחיפוש והחלפה:
לא צריך, אופציונלי זה אומר שניתן פשוט לדלג עליו לגמרי.
הוא מזהה את הארגומנט נכון לפי מספר הארגומנטים (2).וואו, קודם כל אני מתפעל כי זה חידוש בשבילי!
אני מניח שזה מתפרש נכון בגלל ששני הפרמטרים (השני והשלישי) הם נדרשים.
אבל זה עדיין מרגיש לי כאילו יש כאן מקום לדו משמעות (Ambiguity). אני מנסה למצוא איזשהו תרחיש שבו הקומפיילר לא יפרש נכון את הארגומנטים לפי המספר שלהם.
אולי אפתח פוסט חדש בשביל זה... -
פוסט זה נמחק!