Καλημέρα σε όλους!
Θανάση μου,
με χρήση
VBA δεν μπορεί παρά να λειτουργήσει σωστά αφού παίρνει τις συμβολοσειρές κατευθείαν από περιοχή του φύλλου εργασίας (το οποίο είναι καθαρά Unicode) και τις τοποθετεί στη μνήμη.
Το γνωρίζω πάρα πολύ καλά αυτό και ισχύει και για τα υπόλοιπα προγράμματα του Office.
Δεν θα λειτουργήσει σωστά αν οι συμβολοσειρές προς απόδοση είναι αποθηκευμένες μέσα σε κάποια λειτουργική μονάδα.
Αυτό συμβαίνει επειδή ο Επεξεργαστής Visual Basic σε αντίθεση με τη
VB δεν υποστηρίζει Unicode!
Για παράδειγμα:
Σε υπολογιστή με Τοποθεσία "Ελληνικά" σε μια λειτουργική μονάδα σε οποιοδήποτε πρόγραμμα
υποστηρίζει
VBA γράφουμε τον παρακάτω κώδικα:
Sub Test
Dim x as String
x = "Γράφω ελληνικά"
End sub
Αν τώρα στις τοπικές ρυθμίσεις αλλάξουμε την τοποθεσία του υπολογιστή (πχ. σε Γερμανικά)
θα διαπιστώσουμε ότι τα ελληνικά μας έχουν "σπάσει" και αυτό που θα εμφανιστεί και στον
VBE θα είναι:
Sub Test()
Dim x as String
x = "ÃñÜöù åëëçíéêÜ"
End Sub
Αν όμως γράφαμε:
στην Excel:
x = Range("A1")
ή στην Access:
x = Me!TextField
τότε σε κάθε περίπτωση η μεταβλητή
x θα περιείχε χαρακτήρες Unicode και έτσι θα παίρναμε το σωστό αποτέλεσμα.
Και εδώ όμως υπάρχουν εξαιρέσεις όπως:
- τα MsgBox, τα InputBox της VBA
- ο τίτλος του παραθύρου σε φόρμες Access (όταν αυτός αλλάζει δυναμικά)
- ο τίτλος του παραθύρου σε φόρμες (Userform) της Excel αλλά και των άλλων προγραμμάτων του Office.
Για τα MsgBox υπάρχει παραδειγματικό αρχείο στα παραδείγματα της Access και Excel στο φόρουμ.
Για τα inputBox, η Excel έχει δικό της αντικείμενο (Καλείται έτσι: Application.InputBox...) που
υποστηρίζει πλήρως τα Unicode.
Για τις φόρμες και UserForm θα πρέπει να χρησιμοποιηθούν
API των Windows προκειμένου να εμφανίσουμε ελληνικά.
Εδώ θα δώσω ένα απλό παράδειγμα για εμφάνιση ελληνικού τίτλου σε παράθυρο μιας UserForm στην Excel:
Κώδικας:
Option Explicit
Private Const WM_SETTEXT = &HC
Private Declare Function DefWindowProcW Lib "user32" ( _
ByVal hWnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Private Declare Function FindWindow Lib "user32" _
Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Sub UserForm_Initialize()
Dim xhWnd As Long
xhWnd = FindWindow("ThunderDFrame", Me.Caption)
DefWindowProcW xhWnd, WM_SETTEXT, 0, ByVal StrPtr(Me.Label1.Caption)
End Sub
Στο
Label1 περνάμε την ελληνική συμβολοσειρά που θα εμφανιστεί στον τίτλο του παραθύρου της φόρμας.
Τέλος να πω ότι έχω σκοπό να ανεβάσω περισσότερα παραδειγματικά αρχεία και στις άλλες θεματικές ενότητες του φόρουμ
που έχουν σχέση με την επικοινωνία του Outlook και των υπόλοιπων προγραμμάτων του Office.
Τα λέμε...
Τάσος