# [VBA Excel] Asci-Code in Zeichen umwandeln



## MAN (12. August 2004)

Hallo,

wie kann ich einen Ascii-Code in ein Zeichen in VBA umwandeln?

Hierfür gibt es ja in VB den guten alten Chr$()-Befehl. Wenn ich VB auf meinem Rechner installiert habe, gibt es das auch in VBA und funktioniert auch.

Wenn ich das Excel-Makro aber auf nem anderen Rechner ausführe (wo kein VB drauf installiert ist), dann bringt er mir die Fehlermeldung, dass er den Befehl nicht kennt!

Gibt es einen alternativ-Befehl dafür, der VBA-konform ist?


mfG,
MAN


----------



## DrSoong (12. August 2004)

Also, prinzipiell ist *Chr()* (oder auch Chr$()) nicht von VB abhängig, sondern auch eine VBA-Funktion. Es ist egal, ob auf dem entsprechenden PC VB installiert ist oder nicht. Vielleicht gibts in deinem Makro einen Fehler, den du übersehen hast?


Der Doc!


----------



## MAN (12. August 2004)

Definitiv nicht, da er direkt die Funktion "Chr" (bzw. "Chr$") markiert und sagt, dass es den Befehl nicht gibt.

Ich hatte dann versucht auf dem anderen Rechner durch die Zeichen "Chr" + "Klammer auf" zu gucken, ob diese Funktion überhaupt vorhanden ist und der VBA-Makro-Editor den Syntax des Befehls anzeigt - negativ!

Ich hatte mich zwar auch gewundert... mal morgen nochmal gucken, ob es bei diesem anderen PC durch "VBA.Chr$()" funktioniert, diese Möglichkeit würde es ja auch noch geben.

Wer vorzeitig schon eine bessere Lösung oder *die* Lösung hat, wäre ich natürlich ebenfalls sehr dankbar 


mfG,
MAN


----------



## DrSoong (12. August 2004)

Poste doch mal den Code oder stell die Datei ihn hier online, vielleicht kann ich mir dann mehr darunter vorstellen bzw. das ganze testen.


Der Doc!


----------



## MAN (12. August 2004)

Okay, könnt ich aber erst morgen früh machen, bin grad zu hause und die arbeit ist "weit weit weg" 

Ich posts dann hier rein, wenn ich bis dahin nicht schon selbst ne lösung gefunden hab!

mfG,
MAN


----------



## MAN (13. August 2004)

Sodala, habe nun folgenden Code:

```
Private Sub txtName_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
   If Not IsValidNumber(KeyAscii) Then
      KeyAscii = 0
   End If
End Sub

Private Function IsValidNumber(ByVal KeyAscii As MSForms.ReturnInteger) As Boolean
   IsValidNumber = True
   
   If InStr(1, "0123456789", Chr$(KeyAscii), vbTextCompare) = 0 Then
      IsValidNumber = False
   End If
End Function
```
Bei dieser Funktion bringt er beim Ausführen des Makros eben den folgenden Fehler:

*Fehler beim Kompilieren:

Projekt oder Bibliothek nicht gefunden*

den Asc-Befehl kennt er, auch mit Syntax, den Chr-Befehl kennt er nur als Funktion (also der Befehl "Chr" wird in der Liste angezeigt), die Syntax davon will er mir aber nicht anzeigen!

*/edit:*
So, habe es jetzt einfach umgangen, da ich mit dem Projekt heute fertig werden muss. Das schaut jetzt folgendermaßen aus:

```
Private Function IsValidNumber(ByVal KeyAscii As MSForms.ReturnInteger) As Boolean
   IsValidNumber = False
   
   Dim i As Integer
   
   For i = 48 To 57
      If KeyAscii = i Then
         IsValidNumber = True
      End If
   Next i
End Function
```
Habe aber auch noch ein anderes Problem: Common Dialog Control!

Dieses Steuerelement bekommt man ja auch nur übers "comdlg32.ocx". Welche Alternative gibt es, mit der es auf allen Betriebssystemen gut läuft, ohne noch ocx's oder dlls einzubinden?

*/edit (2):*
So, jetzt habe ich auch da eine gute Alternative gefunden. Und zwar gibt es ja die comdlg32.dll auf jedem Rechner (nur das ocx dazu nicht). Deshalb kann man ja die Funktionen aus der DLL benutzen, bin dann auf folgenden Code gekommen:


```
Option Explicit
 
Type SAVEFILENAME
  lStructSize As Long
  hwndOwner As Long
  hInstance As Long
  lpstrFilter As String
  lpstrCustomFilter As String
  nMaxCustFilter As Long
  nFilterIndex As Long
  lpstrFile As String
  nMaxFile As Long
  lpstrFileTitle As String
  nMaxFileTitle As Long
  lpstrInitialDir As String
  lpstrTitle As String
  Flags As Long
  nFileOffset As Integer
  nFileExtension As Integer
  lpstrDefExt As String
  lCustData As Long
  lpfnHook As Long
  lpTemplateName As String
End Type
 
Declare Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" (pOpenfilename As SAVEFILENAME) As Long
 
Public Function SaveDlg() As String
   Dim SaveDlg As SAVEFILENAME
   Dim result As Long
   Dim hWnd As Long
   Dim Buffer As String
   
   SaveDlg = ""
   
   Buffer = String$(128, 0)
   
   SaveDlg.lpstrTitle = "Speichern..."
   SaveDlg.lStructSize = Len(SaveDlg)
   SaveDlg.hwndOwner = hWnd
   SaveDlg.nFilterIndex = 1
   SaveDlg.nMaxFile = Len(Buffer)
   SaveDlg.lpstrFile = Buffer
   SaveDlg.lpstrFilter = "Excel-Sheet (*.xls)" & vbNullChar & "*.xls"
   
   result = GetSaveFileName(SaveDlg)
   
   If result <> 0 Then
      SaveDlg = Left$(SaveDlg.lpstrFile, InStr(SaveDlg.lpstrFile, vbNullChar) - 1) & ".xls"
   End If
End Function
```

Jetzt bin ich vollkommen zufrieden 


mfG,
MAN


----------



## DrSoong (13. August 2004)

Na bitte, schön dass wir dir helfen konnten.  


Der Doc!


----------

