אופיס 365 רשימה לפקד משולב

  • הוסף לסימניות
  • #1
יש לי פקד משולב עם רשימה כזו
אבא
אמא

איך אני עושה שאם כותבים "בא" הוא יציע אבא ולא רק אם כותבים מתחילת המילה?
 
  • הוסף לסימניות
  • #2
בגדול הדרך היא לעשות קוד לאחר עדכון שיעדכן את מקור הנתונים של הפקד כך שיביא רק את השדה שמכיל מה שכתבת.
 
  • הוסף לסימניות
  • #3
יש כאן קובץ שפעם פורסם כאן בפורום.
אני לא זוכר למי מגיע הקרדיט....
 

קבצים מצורפים

  • חיפוש מתקדם.rar
    KB 27 · צפיות: 60
  • הוסף לסימניות
  • #4
מעודכן:

יש ליצור מודול מחלקה עם הקוד הבא:
קוד:
Option Compare Database
Option Explicit

Private Direction As Boolean

Public Function ChipushShinuy()
    On Error Resume Next
    If Direction Then
        Direction = False
    Else
        Screen.ActiveControl.Tag = Screen.ActiveControl.Text
        Screen.ActiveControl.RowSource = Screen.ActiveControl.RowSource
        Screen.ActiveControl.Dropdown
    End If
End Function

Public Function ChipushGotFocus()
    On Error Resume Next
    Screen.ActiveControl.Tag = ""
    Direction = False
    Screen.ActiveControl.RowSource = Screen.ActiveControl.RowSource
End Function

Public Function ChipushKeyUp(KeyCode As Integer)
    On Error Resume Next
    If KeyCode = 38 Or KeyCode = 40 Then Direction = True
End Function

Public Function ChipushKeyDown(KeyCode As Integer)
    On Error Resume Next
    If KeyCode = 38 Or KeyCode = 40 Then Direction = True
End Function

Public Function ChipushNotInList()
    On Error Resume Next
    Dim Sql As Recordset
    Set Sql = CurrentDb.OpenRecordset(Screen.ActiveControl.RowSource)
    ChipushNotInList = Sql(Screen.ActiveControl.BoundColumn - 1)
    Set Sql = Nothing
End Function
במודול נוסף:
קוד:
Option Compare Database
Option Explicit

Public Function Chipush() As String
    On Error Resume Next
    Chipush = Screen.ActiveControl.Tag
End Function
לאחר מכן בכל פקד שרוצים להכניס מכניסים בשאילתת מקור השורה את התנאי הבא בעמודה המתאימה :
קוד:
ALike "%" & Chipush() & "%"

יש להגדיר הרחב אוטומטית ללא

לאחר מכן לגשת לVBA
:
צריך לתת שם למודול הארוך (אני נתתי לדוג' clsChipush)
צריך לתת שם לכל פעם שמשתמשים לפקד (בדוג' Shem)
בחלק העליון של המודול של הטופס להוסיף
קוד:
private <<שם באנגלית>> as <<שם המודול הארוך>>
דוג'
private Shem as clsChipush

ובעת טעינה של הטופס להוסיף
קוד:
set <<השם באנגלית>> = new <<שם המודול הארוך>>
דוג'
set Shem = new clsChipush

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

בעת שינוי:
קוד:
<<השם באנגלית>>.ChipushShinuy
בעת קבלת מוקד:
קוד:
<<השם באנגלית>>.ChipushGotFocus
בעת ירידת מקש:
קוד:
<<השם באנגלית>>.ChipushKeyDown KeyCode
בעת עליית מקש:
קוד:
<<השם באנגלית>>.ChipushKeyUp KeyCode
בעת שלא ברשימה:
קוד:
On Error Resume Next
Response = 0
Me.ActiveControl = <<השם באנגלית>>.ChipushNotInList
<<שם הפקד>>_AfterUpdate
במקרה הצורך בלבד להכניס את שורת הפקד לאחר עדכון
 
נערך לאחרונה ב:
  • הוסף לסימניות
  • #5
@אפר הכנסתי וזה מה שאני מקבל
ושגיאה בפתיחת הטופס
1645440489499.png
 
  • הוסף לסימניות
  • #6
@אפר עכשיו ניסיתי לעשות כך
1645442795835.png

אבל אחרי כל אות שאני מקליד נסגרת הרשימה וקופצת הודעת שגיאה (אני מקיש אנד, וממשיך וזה עובד)
 
  • הוסף לסימניות
  • #7
שכחתי שני חלקים נוספים

צריך לתת שם למודול הארוך (אני נתתי לדוג' clsChipush)
צריך לתת שם לכל פעם שמשתמשים לפקד (בדוג' Shem)
בחלק העליון של המודול של הטופס להוסיף
קוד:
private <<שם באנגלית>> as <<שם המודול הארוך>>
דוג'
private Shem as clsChipush

ובעת טעינה של הטופס להוסיף
קוד:
set <<השם באנגלית>> = new <<שם המודול הארוך>>
דוג'
set Shem = new clsChipush
 
  • הוסף לסימניות
  • #10
לסיכום ערכתי את הפוסט המקורי
עכשיו אמור לעבוד חלק

לא כתבתי את זה מספיק אחיד וברור בתחילה
זה הקוד בטופס
קוד:
Option Compare Database
Private Shem As AutoComplete1


Private Sub cboCity_AfterUpdate()
    DoCmd.Save acForm, "XYZ"
    DoCmd.RefreshRecord
End Sub

Private Sub cboCity_Change()
    Shem.ChipushShinuy
End Sub

Private Sub cboCity_GotFocus()
    Shem.ChipushGotFocus
End Sub

Private Sub cboCity_KeyDown(KeyCode As Integer, Shift As Integer)
    Shem.ChipushKeyDown KeyCode
End Sub

Private Sub cboCity_KeyUp(KeyCode As Integer, Shift As Integer)
    Shem.ChipushKeyUp KeyCode
End Sub

Private Sub cboCity_NotInList(NewData As String, Response As Integer)
On Error Resume Next
Response = 0
Me.ActiveControl = Shem.ChipushNotInList
cboCity_AfterUpdate
End Sub

Private Sub Form_Load()
 Set Shem = New AutoComplete1
End Sub
וזה מקפיץ שגיאה
1645447690706.png


אולי צריך לשנות משהו גם במודולים עצמם?
 
  • הוסף לסימניות
  • #11
זה הקוד בטופס
קוד:
Option Compare Database
Private Shem As AutoComplete1


Private Sub cboCity_AfterUpdate()
    DoCmd.Save acForm, "XYZ"
    DoCmd.RefreshRecord
End Sub

Private Sub cboCity_Change()
    Shem.ChipushShinuy
End Sub

Private Sub cboCity_GotFocus()
    Shem.ChipushGotFocus
End Sub

Private Sub cboCity_KeyDown(KeyCode As Integer, Shift As Integer)
    Shem.ChipushKeyDown KeyCode
End Sub

Private Sub cboCity_KeyUp(KeyCode As Integer, Shift As Integer)
    Shem.ChipushKeyUp KeyCode
End Sub

Private Sub cboCity_NotInList(NewData As String, Response As Integer)
On Error Resume Next
Response = 0
Me.ActiveControl = Shem.ChipushNotInList
cboCity_AfterUpdate
End Sub

Private Sub Form_Load()
 Set Shem = New AutoComplete1
End Sub
וזה מקפיץ שגיאה
צפה בקובץ המצורף 1069669

אולי צריך לשנות משהו גם במודולים עצמם?
AutoComplete1 זה השם של המודל הארוך? (אם לא אז תחליף)
 
  • הוסף לסימניות
  • #16
@אפר עכשיו אני רואה באג חדש, שאם אני כותב צירוף אותיות שלא מופיע בכלל במקור השורה, זה פשוט נתקע ושולח לדיבוג בעורך קוד..
איך אפשר לסדר את זה שלא ישתגע עם הצירוף שהזנתי בשדה לא מתאים כלל?
 
  • הוסף לסימניות
  • #17
@אפר עכשיו אני רואה באג חדש, שאם אני כותב צירוף אותיות שלא מופיע בכלל במקור השורה, זה פשוט נתקע ושולח לדיבוג בעורך קוד..
איך אפשר לסדר את זה שלא ישתגע עם הצירוף שהזנתי בשדה לא מתאים כלל?
באופן עקרוני זה כבר מטופל אם הכנסת בעת שלא ברשימה
תבדוק שמופיע [פרוצדורת אירוע] בעת שלא ברשימה
 
  • הוסף לסימניות
  • #18
הכנסתי את זה בבעת שלא ברשימה, ולא עובד:
קוד:
Private Sub cboxyz_NotInList(NewData As String, Response As Integer)
On Error Resume Next
Response = 0
Me.ActiveControl = Shem.ChipushNotInList
cboxyz_AfterUpdate
End Sub
יכול להיות שהשורה הזו cboxyz_AfterUpdate צריכה להיות פקד אחר?
 
נערך לאחרונה ב:
  • הוסף לסימניות
  • #19
הכנסתי את זה בבעת שלא ברשימה, ולא עובד:
קוד:
Private Sub cboxyz_NotInList(NewData As String, Response As Integer)
On Error Resume Next
Response = 0
Me.ActiveControl = Shem.ChipushNotInList
cboxyz_AfterUpdate
End Sub
יכול להיות שהשורה הזו cboxyz_AfterUpdate צריכה להיות פקד אחר?
כתבתי שאם לא קיים קוד לאחר עדכון לא לכתוב את השורה הזו
אם זו לא הבעיה תראה לי מה השורה שבה נתקע הקוד
 
  • הוסף לסימניות
  • #20
צדקת זו אכן היתה הבעיה, סליחה על ההטרדה!!
 

פרוגבוט

תוכן שיווקי
פרסומת
למעלה