Translate

Dienstag, 20. Dezember 2011

Google-Übersetzer aus VB(A) nutzen

Der Google Übersetzer Dienst wird immer besser. Daher die Idee diesen automatisiert mit VB/VBA zu nutzen.
Voraussetzungen sind: Verbindung zum Web und Internet Explorer.

Mehr dazu hier: http://www.vbarchiv.net/tipps/tipp_2243-mit-vb-und-internet-explorer-google-bersetzer-nutzen.html

Freitag, 16. Dezember 2011

Datum an SQL-String korrekt übergeben

Sollten Sie in VBA einen SQL-Ausdruck mit Datumsangaben zusammenstellen wollen, ist darauf zu achten dass das Datumsformat im amerikanische Format (mm/dd/yy) oder das ISO-Format (yyyy-mm-dd) übergeben wird.

Dies erreichen Sie durch die folgende Funktion:
Format(MeinDatum, "\#yyyy\-mm\-dd\#")



Der VBA-Code könnte also so aussehen:
Dim tmpAs String
Dim strSQL As String

tmp= Format(MeinDatum, "\#yyyy\-mm\-dd\#")
strSQL = "SELECT * FROM Tabelle WHERE Datumsfeld <= " & tmp

Wie kann die exakte Kalenderwoche aus einem Datum in Excel/Access/VBA ermittelt werden?

Die Kalenderwoche wird immer wieder gerne für die Terminplanung hinzugezogen.
Leider gibt es in Excel und Access standardmäßig keine Funktion, die aus einem Datum die Kalenderwoche errechnet.
Achtung, einige Lösungen die im Netz kursieren sind fehlerhaft.

Wir haben hier für Sie die Formel zusammen gestellt um die exakte Kalenderwoche zu errechnen.


In Access:
Wenn(IstDatum([Datumsfeld]);Int(([Datumsfeld]-Wochentag([Datumsfeld];2)-DatSeriell(Jahr([Datumsfeld]+4-Wochentag([Datumsfeld];2));1;-10))/7);0)

Das Feld [Datumsfeld] ist zu ersetzen durch ihren Feldnamen.

Hinweis:Die kursierende Lösung DatTeil("ww";[datum];2;2) ist teilweise fehlerhaft. Die Kalenderwoche vom 29.12.2031 ist 1 und nicht 53.


In Excel:WENN(ISTZAHL(A1);KÜRZEN((A1-WOCHENTAG(A1;2)-DATUM(JAHR(A1+4-WOCHENTAG(A1;2));1;-10))/7);0)

Der Bezug A1 verweist auf ihre Datumszelle.

Hinweis:Excel-Funktion KALENDERWOCHE ist nicht Din-Konform. Laut Excel beginnt die Kalenderwoche 1 immer am 01.01. eines Jahres. Dies stimmt mit der deutschen Din-Norm nicht überrein. Hier ist die 1.KW immer die Woche in die der 04.01. fällt. Ist also der 1ste eines Jahres in einer anderen woche als der 4. zeigt die Kalenderwochen - Funktion von excel einen Falschen wert.

In VBA:
Public Function CalWeek(Date_Value As Variant) As Byte
    'Created by Jean Pierre Allain
   
    Dim tmp As Date
    On Error GoTo Err_Proc
    If IsNumeric(Date_Value) Then
        tmp = Date_Value
    ElseIf IsDate(Date_Value) Then
        tmp = DateValue(Date_Value)
    Else
        GoTo Exit_Proc
    End If
    CalWeek = Int((tmp - Weekday(tmp, 2) - DateSerial(Year(tmp + 4 - Weekday(tmp, 2)), 1, -10)) / 7)
   
Exit_Proc:
    Exit Function
   
Err_Proc:
    Resume Exit_Proc
End Function

Anmerkung: Bei einem ungültigen Datum, liefern die Funktionen den Wert 0 zurück.

Bedingte Textverkettung mit Trennzeichen

Eine Funktion um beliebig viele Texte zu verketten mit seinem jeweiligen Trennzeichen, welches nur dann verwenden wird, wenn der Text nicht leer ist.
Häufig müssen Texte mit Trennzeichen Verkettet werden:
 
[Nachname] & ", " & [Vorname] -> "Allain, Jean Pierre"

Sollte allerdings das Feld [Vorname] null sein, erhält man folgendes:
"Allain, "

Mit IF oder IIF kann man diesen Fall abfangen.
Bei längeren Verkettung wie diese:
[Anrede] & " " & [Titel] & " " & [Vorname] & " " & [Nachname]
wird es schnell unübersichtlich. 

Lesen Sie dazu eine Lösung hier: http://www.vbarchiv.net/tipps/details.php?id=2074

Donnerstag, 15. Dezember 2011

Dezimalzahl an SQL-String / VBA korrekt übergeben

Die Konvertierungsfunktion von Text in einen Wert ist bekannterweise die Funktion VAL(String)
Nur die Funktion VALUE benötigt in der VBA-Umgebung immer den Punkt als Dezimaltrennzeichen.
In einigen Länder wie Deutschland wird bekannterweise das Komma als Dezimaltrennzeichen verwendet.
Das Komma wird von VBA jedoch nicht als Dezimaltrennzeichen erkannt, sondern als ein Buchstabe. Somit ergibt VAL("100,6") den Wert 100 und nicht 100,6
Oder VAL("1.500,6") ergibt den Wert 1,5

Es liegt also nah über die Funktion Replace() das Komma durch ein Punkt ersetzen zu lassen.
Das erzeugt auch das Richtig Ergebnis, allerdings nur solange der VBA-Code auf einer Maschine mit dieser Ländereinstellung läuft.
Mit der englischen Ländereinstellung und der englischen Eingabeform wird aus
Replace("1,500.6" , "," , ".") der Text "1.500.6" und VAL("1.500.6") ergibt wieder die 1,5

Also wieder falsch :-(

Die folgende alternative funktioniert immer: VAL(STR("100,6")

Und um sicher zu gehen, dass "100,6" auch wirklich einen Wert darstellt, sollten Sie dies mit der Funktion ISNUMERIC prüfen.

Einen Wert Abfrage wobei die Dezimalstellen berücksichtig werden, könnte also so aussehen:
    Dim Rückgabewert As String, Wert As Double
    Rückgabewert = InputBox("Ihr Wert:", , 100)
    If IsNumeric(Rückgabewert ) then
       Wert = Val(Str(Rückgabewert))
    End If 
Denken Sie daran, alle Eingabefelder in Formularen sind Textfelder und keine Zahlenfelder!