קבלת ערך Enum ממספר - VBA
-
ערב טוב.
לצורך ייעול קוד שלי היה לי רצון למצוא דרך לקבל נתון מתוך רשימת Enum בקוד VBA באקסס.
כלומר, כידוע רשימה זו מחזירה רק מספר ולא ערך, ורציתי לקבל את הערך ולא רק את המספר (מקווה שאני מובן).
לצורך זה כתבתי את הקוד הבא, ובקשתי היא האם חברי הפורום יוכל לעבור עליו, אשמח לקבל כל הערה/הארה.
תודה.Option Compare Database Option Explicit Public Enum EnumTest a = 1 b = 2 c = 3 E = 15 End Enum Public Function FindEnumString(EnumNum As String, EnumName As String, Optional ModuleName As String) As String Dim ModStr As String Dim EnumStr() As String Dim i If ModuleName = "" Then ModuleName = VBE.ActiveCodePane.CodeModule ModStr = VBE.ActiveVBProject.VBComponents.item(ModuleName).CodeModule.Lines(1, VBE.ActiveVBProject.VBComponents.item(ModuleName).CodeModule.CountOfLines) ModStr = Mid(ModStr, InStr(1, ModStr, "Enum " & EnumName) + Len("Enum " & EnumName), InStr(1, ModStr, "End Enum") - (InStr(1, ModStr, "Enum " & EnumName) + Len("Enum " & EnumName))) EnumStr = Split(ModStr, vbCrLf) For i = LBound(EnumStr) To UBound(EnumStr) If Trim(Right(EnumStr(i), Len(EnumStr(i)) - InStr(1, EnumStr(i), "="))) = EnumNum Then FindEnumString = Trim(Left(EnumStr(i), InStr(1, EnumStr(i), "=") - 1)) End If Next i End Function Public Function test() Dim En As String En = EnumTest.b Debug.Print En & " (" & FindEnumString(En, "EnumTest") & ")" End Function
-
@ארי יפה, מתאים לקוד שאתה כותב. אבל לקוד של אחרים צריך זהירות.
יש אפשרות לכתוב Const ב Enum, ואז זה לא יעבוד.
הנה דוגמה של שגיאה:Option Compare Database Option Explicit Const myConst As Integer = 4 Public Enum EnumTest A = 1 B = 2 c = myConst E = 15 End Enum Public Function FindEnumString(EnumNum As String, EnumName As String, Optional ModuleName As String) As String Dim ModStr As String Dim EnumStr() As String Dim i If ModuleName = "" Then ModuleName = VBE.ActiveCodePane.CodeModule ModStr = VBE.ActiveVBProject.VBComponents.item(ModuleName).CodeModule.Lines(1, VBE.ActiveVBProject.VBComponents.item(ModuleName).CodeModule.CountOfLines) ModStr = Mid(ModStr, InStr(1, ModStr, "Enum " & EnumName) + Len("Enum " & EnumName), InStr(1, ModStr, "End Enum") - (InStr(1, ModStr, "Enum " & EnumName) + Len("Enum " & EnumName))) EnumStr = Split(ModStr, vbCrLf) For i = LBound(EnumStr) To UBound(EnumStr) If Trim(Right(EnumStr(i), Len(EnumStr(i)) - InStr(1, EnumStr(i), "="))) = EnumNum Then FindEnumString = Trim(Left(EnumStr(i), InStr(1, EnumStr(i), "=") - 1)) End If Next i End Function Public Function test() Dim En As String En = EnumTest.c Debug.Print En & " (" & FindEnumString(En, "EnumTest") & ")" End Function
-
@Y-Excel-Access אכן במקרה כזה הקוד לא יעבוד.
אמנם הוא לא מחזיר שגיאה, אבל גם לא את הערך המבוקש.