~~DISCUSSION:off~~ ~~NOCACHE~~ ns=%NAMESPACE% ======[VBA] [Access] Functions====== Eine Sammlung von Funktionen die ich mehrheitlich in VBA MS Access verwende. Siehe dazu auch noch meine allgemeinen [[:Vba:Functions:]] sowie die [[:Vba:Functions:array:]]. ===== Funktionen mit eigener Seite ===== {{pagequery> ^%%ns%%:(?!index)[^:]+(?::index)?$; fullregex; sort=ns:asc,title:asc; display={title}; snippet=plain,999999,l1; bullet=square; fontsize=100%; hidemsg; hidejump; }} =====Rund um SQL===== ====getSQLType()==== Eine Funktion um DAO.DateTypeEnum in die DDL-Syntax zu wandeln. '/** ' * Gibt den SQL-Type für ein DAO.DataTypeEnum zurück. ' * Diesen kann man für automatisierte CRATE TABLE oder ALTER TABLE verwenden ' * @param DAO.DataTypeEnum ' * @param Integer ' * @return String ' */ Public Function getSQLType(ByVal iVarType As DAO.DataTypeEnum, Optional ByVal iSize As Integer = 50) As String Select Case iVarType Case dbText: getSQLType = "TEXT(" & iSize & ")" Case dbLong: getSQLType = "LONG" Case dbInteger: getSQLType = "INTEGER" Case dbBoolean: getSQLType = "YESNO" Case dbMemo: getSQLType = "MEMO" Case dbByte: getSQLType = "BYTE" Case dbSingle: getSQLType = "SINGLE" Case dbCurrency: getSQLType = "CURRENCY" Case dbTimeStamp: getSQLType = "DATETIME" Case dbBinary: getSQLType = "BINARY(" & iSize & ")" Case dbLongBinary: getSQLType = "LONGBINARY" Case Else: getSQLType = "TEXT(" & iSize & ")" End Select End Function ====createIncrementField()==== '/** ' * erstellt ein Auto-Feld in einer Tabelle ' * @param String Tabellenname ' * @param String Feldname ' */ Public Sub createIncrementField(ByVal tableName As String, Optional ByVal FieldName As String = "id") Dim fld As field On Error GoTo Err_Handler Set fld = CurrentDb.TableDefs(tableName).CreateField(FieldName, dbLong) fld.Attributes = dbAutoIncrField Call CurrentDb.TableDefs(tableName).fields.append(fld) Exit_Handler: Set fld = Nothing Exit Sub Err_Handler: msgBox Err.DESCRIPTION GoTo Exit_Handler Resume End Sub ====resetIncrementField()==== '/** ' * Setzt den Wert einer AutoNumber Spalte zurück ' * @param Name der Tabelle ' * @param Name der Auto-Number Spalte ' */ Public Sub resetIncrementField(ByVal iTableName As String, ByVal iColName As String) Call CurrentDb.execute("ALTER TABLE [" & iTableName & "] ALTER COLUMN [" & iColName & "] COUNTER(1,1)") End Sub ====truncate()==== Eine Tabelle vollständig leeren '/** ' * leert eine Tabelle ' * @param String ' */ Public Sub truncate(ByVal tableName As String) Call CurrentDb.execute("DELETE FROM " & tableName) End Sub ====translateTableFields()==== Häufig bekomme ich Tabellen im Excel-Format. Diese sind schnell importiert. Jedoch haben sie dann meistens irgendwelche netten und schön lesbare Spaltenüberschriften. Mit dieser Funktion kann ich alle Spaltennamen in technische Spaltennamen wandeln . Diese Funktion verwendet die Funktion [[http://wiki.yaslaw.info/wikka/VbAccessFunctions#translateToTechName translateToTechName()]]. '/** ' * Wandelt alle Spaltennamen in technische Namen. Praktisch nach einem Erstimport aus Excel ' * @used http://wiki.yaslaw.info/wikka/VbAccessFunctions#translateToTechName ' * @param String Tabellenname ' */ Public Sub translateTableFields(ByVal iTableName As String) Dim tbl As DAO.TableDef Dim dbs As DAO.Database Dim fld As DAO.field Set dbs = CurrentDb Set tbl = dbs.TableDefs(iTableName) For Each fld In tbl.fields fld.name = translateToTechName(fld.name) Next Set fld = Nothing Set tbl = Nothing Set dbs = Nothing End Sub =====Rund um Formulare===== ====formIsLoaded()==== '/** ' * Überprüft ob ein bestimmtes Formular geöffnet (geladen) ist ' * @param String Name des Formulares ' * @return Boolean ' */ Public Function formIsLoaded(ByVal strFormName As String) As Boolean formIsLoaded = False If SysCmd(acSysCmdGetObjectState, acForm, strFormName) <> 0 Then If Forms(strFormName).CurrentView <> 0 Then formIsLoaded = True End If End If End Function ====closeAllForms()==== '/** ' * Schliesst alle geladenen Formulare mit Ausnahmen ' * @param AcCloseSave iSave Access-Type ob die Daten der Formulare gespeichert werden sollten ' * @param Array iExceptions Array mit den Namen der Formulare die nicht geschlossen werden sollen ' * @return void ' */ Public Function closeAllForms(Optional ByVal iSave As AcCloseSave = acSaveNo, Optional ByVal iExceptions As Variant) Dim pForm As Form For Each pForm In Forms If IsArray(iExceptions) Then If ArrayIndex(pForm.name, iExceptions) < -1 Then Call DoCmd.Close(acForm, pForm.name, acSavePrompt) Else Call DoCmd.Close(acForm, pForm.name, acSavePrompt) End If Next pForm End Function ====cm2twips()==== '/** ' * Wandelt zu cm zu Twips ' * @param Variant cm (Entweder ein Array von cm, oder ein einzelner ' * @return Variant Twips (Entweder ein Array von Twips, oder ein einzelner ' */ Function cm2twips(ByVal iCm As Variant) As Variant Dim i As Long Dim pArray() As Variant Dim flagArray As Boolean On Error GoTo Err_Handler flagArray = IsArray(iCm) If Not flagArray Then iCm = Array(iCm) ReDim pArray(LBound(iCm) To UBound(iCm)) For i = LBound(iCm) To UBound(iCm) pArray(i) = CLng(Fix(iCm(i) * 567)) Next i cm2twips = IIf(flagArray, pArray, pArray(LBound(pArray))) Exit_Handler: Exit Function Err_Handler: cm2twips = Null GoTo Exit_Handler Resume End Function ====twips2cm()==== '/** ' * Wandelt Twips zu cm ' * @param Variant Twips (Entweder ein Array von Twips, oder ein einzelner ' * @retrun Variant cm (Entweder ein Array von cm, oder ein einzelner ' */ Function twips2cm(ByVal iTwips As Variant) As Variant Dim i As Long Dim pArray() As Variant Dim flagArray As Boolean On Error GoTo Err_Handler flagArray = IsArray(iTwips) If Not flagArray Then iTwips = Array(iTwips) ReDim pArray(LBound(iTwips) To UBound(iTwips)) For i = LBound(iTwips) To UBound(iTwips) pArray(i) = CDbl(iTwips(i) / 567) Next i twips2cm = IIf(flagArray, pArray, pArray(LBound(pArray))) Exit_Handler: Exit Function Err_Handler: twips2cm = Null GoTo Exit_Handler End Function =====Rund um Access System===== ====changeProperty()==== '/** ' * Ändert ein DB-Property ' * @param String Name des Property ' * @param Variant Type des Property ' * (Wird nur verwendet, wenn das Property noch nicht exisitert. Weitere Infos unter CurrentDb.CreateProperty) ' * @param Variant Wert des Property ' * @return void ' */ Public Function changeProperty(ByVal iname As String, ByVal itype As Variant, ByVal iValue As Variant) As Boolean Const C_PORPERTY_NOT_FOUND = 3270 Dim pProprty As Property On Error GoTo Err_Handler CurrentDb.Properties(iname) = iValue ChangeProperty = True Exit_Handler: Exit Function Err_Handler: If Err = C_PORPERTY_NOT_FOUND Then ' Property not found. Set pProprty = CurrentDb.CreateProperty(iname, itype, iValue) CurrentDb.Properties.append pProprty Resume Next Else ChangeProperty = False Resume Exit_Handler End If End Function ====objectExists()==== Eine Funktion um zu überprüfen ob ein bestimmtes Objekt in der Acces DB exisitert. Dese Lösung basiert auf dem Try-and-Error Pattern. '/** ' * Prüft ob ein bestimmtest Access-Objekt existiert ' * @param Type vom Objekt ' * @param Name des gesuchten Objektes ' * @retrun ' * @example If ObjectExists(acQuery, "vw_temp") then CurrentDb.QueryDefs.Delete("vw_temp") ' */ Public Function objectExists(ByVal iObjectType As AcObjectType, ByVal iObjectName As String) As Boolean Dim dummy As Variant On Error Resume Next 'Je nach Type unterschiedlich prüfen Select Case iObjectType Case acTable: Set dummy = CurrentDb.TableDefs(iObjectName) Case acQuery: Set dummy = CurrentDb.QueryDefs(iObjectName) Case acForm: Set dummy = CurrentProject.AllForms(iObjectName) Case acReport: Set dummy = CurrentProject.AllReports(iObjectName) Case acModule: Set dummy = CurrentProject.AllModules(iObjectName) Case acMacro: Set dummy = CurrentProject.AllMacros(iObjectName) Case Else: Err.Raise (-1) End Select 'Wenn kein Fehler aufgetretten ist, exisitert das Objekt objectExists = (Err.Number = 0) Call dummy.Close Set dummy = Nothing Err.clear End Function Und falls man zusätzlich auf die Existenz einer Funktion prüfen möchte, diesen Case noch hinzufügen ' Für desen Teil braucht es eine Referenz auf 'Microsoft Visual Basic for Applications Extensibility' Case acFunction: Dim cp As CodePane For Each cp In VBE.CodePanes Err.clear dummy = cp.CodeModule.ProcStartLine(iObjectName, vbext_pk_Proc) If Err.Number = 0 Then Exit For Next Set cp = Nothing {{tag>VBA MS_Access}}