Anzeige
Archiv - Navigation
684to688
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
684to688
684to688
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Variable Namen automatisch erkennen

Variable Namen automatisch erkennen
23.10.2005 10:25:12
Erich
Hallo EXCEL-Freunde,
ich erstelle ein Makro, bei dem 20 Mitglieder angesprochen werden.
Mitglied1 bis Mitglied20
1. Frage:
Wie kann ich die Variablenbezeichnung abkürzen; muss ich 20x schreiben
Dim Mitglied1 As String, Mitglied2 As String usw., oder gehts kürzer?
2. Frage:
Die Mitgliedsnamen werden gleichzeitig für zwei weitere Bezeichnungen verwendet:
strsh (=Tabellenname)
strName (wird Name einer neuen Datei)
Wie kann ich hier dem Code beibringen, dass
strsh1 = Mitglied1
strsh2 = Mitglied2 usw.
strName1 = Mitglied1
strName2 = Mitglied2 usw.
Besten Dank für eine Hilfe!
mfg
Erich
EXCEL-Shareware und Freeware: http://www.toolex.de
Private Tippgemeinschaft für Lotto oder KENO: http://www.kenostrategen.de

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Variable Namen automatisch erkennen
23.10.2005 10:32:54
Hajo_Zi
Hallo Erich
benutze ein Array
Bitte keine Mail, Probleme sollten im Forum gelöst werden.
Microsoft MVP für Excel
Das Forum lebt auch von den Rückmeldungen.
Betriebssystem XP Home SP2 und Excel Version 2003 SP2.


AW: Variable Namen automatisch erkennen
23.10.2005 11:13:46
Erich
Hallo Namensvetter,
das mit dem Array hat Hajo schon geschrieben.
Wenn du die Werte einer Variablen (oder eben auch eines Arrays) mehrfach benötigst, kannst du die Variablen auch mehrfach verwenden. Konkret: Wenn du jeweils ohnehin den Mitgliedsnamen nimmst, brauchst du nicht verschienden Variablen für Blattnamen und Dateinamen.
Ein Beispiel:
("If ii = 13 ..." steht da nur drin, weil in dem Beispiel nichts anderes belegt ist.)
Sub tst() Dim strMitgl(1 To 20) As String, ii As Integer strMitgl(13) = "Hans Meier" For ii = 1 To 20 If ii = 13 Then Sheets(1).Name = strMitgl(ii) ActiveWorkbook.SaveAs strMitgl(ii) & ".xls" End If Next ii End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Variable Namen automatisch erkennen
23.10.2005 11:56:01
Erich
Hallo Erich,
besten Dank - das hilft mir ein ganzes Stück weiter. Jetzt fehlt mir nur noch eine
Schleife
für die Versendung. Dabei habe ich für jedes Mitglied einen eigenen Code
Sub SendenstrMitgl1 usw., der die jeweilige Anrede und Adresse enthält.
Aber wie kann ich diesen Code aktivieren, da SendenstrMitgl(ii) nicht akzeptiert wird
und irgendwie müsste ich den "Senden-Code" für jedes Mitglied mit der Schleife anstossen:
For ii = 1 To 2
strPath = "C:\Windows\Temp\"
strFile = strPath & strMitgl(ii) & ".xls"
Application.ScreenUpdating = False
Sheets(Array(strMitgl(ii), strsh20)).Copy
For i = 1 To Sheets.Count
Sheets(i).Activate
Call Verknuepfungen_löschen
Next i
Range("A1").Select
Application.CutCopyMode = False
With ActiveWorkbook
.SaveAs strFile
SendenstrMitgl(ii) strFile 'GEHT NICHT !!!!!!
.Close
End With
Kill strFile 'Datei löschen
Next ii

Besten Dank für eine weitere Hilfe!
mfg
Erich
EXCEL-Shareware und Freeware: http://www.toolex.de
Private Tippgemeinschaft für Lotto oder KENO: http://www.kenostrategen.de
Anzeige
AW: Variable Namen automatisch erkennen
23.10.2005 13:36:10
Erich
Hallo anderer Erich,
wie heißen denn die 20 mitgliedsbezogenen Routinen, die du in einer Schleife aufrufen willst? Ich vermute: SendenstrMitgl1 bis SendenstrMitgl20. abc1 ist aber etwas völlig anderes als abc(1).
Der Aufruf "SendenstrMitgl(ii) strFile" ließe auf ein Array von Subroutinen schließen - so wtwas gibt es in VBA nicht. Warum hast du überhaupt für das Senden mehrere Routinen? Da würde IMHO eine einzige reichen, der beim Aufruf die laufende Nummer des Mitglieds übergegeben wird. (Für das Zwischenspeichern in temp hast du ja auch nicht 20 Routinen.)

Sub tst()
Dim ii As Integer, strFile As String
For ii = 1 To 20
Senden ii, strFile
Next ii
End Sub


Sub Senden(intNr As Integer, strDat As String)
Dim strAnrede(20) As String, strAdresse(20) As String
strAnrede(1) = "Herr"
strAnrede(2) = "Frau"
' usw.
strAdresse(1) = "ab@efg.de"
strAdresse(2) = "xyz@efg.de"
' usw.
' (Anrede, Adresse usw. könnten auch in einem Excelsheet stehen...)
' Senden starten mit
'    strDat mit Anrede strAnrede(intNr) an strAdresse(intNr)
End Sub

Noch 'ne Bemerkung:
Die Zeile "Range("A1").Select" selektiert A1 im letzten Sheet der Mappe. Soll dat?

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Variable Namen automatisch erkennen
23.10.2005 13:59:41
Erich
Hallo Erich,
zunächst besten Dank; melde ich nach Test heute abend nochmals!
mfg
Erich
EXCEL-Shareware und Freeware: http://www.toolex.de
Private Tippgemeinschaft für Lotto oder KENO: http://www.kenostrategen.de
AW: Variable Namen automatisch erkennen
23.10.2005 22:06:28
Erich
Hallo Erich,
jetzt steige ich leider aus. Evtl. kriegst Du aber eine Lösung hin. Bei den Mails geht
es darum, dass aus einer Datei zwei Sheets ausgewählt werden, wobei ein Sheet immer
der gleiche Name ist und ein Sheet immer dem Namen des Mitglieds entspricht.
Hier mein Code ohne Schleife und mit 20 x senden:
Sub Mehrmails()
Dim strPath As String
Dim strFile As String
Dim strMitgl(1 To 20) As String
Dim strsh20 As String
Dim i As Integer, ii As Integer
strMitgl(1) = "Mayr1"
strMitgl(2) = "Mayr2"
strMitgl(3) = "Mayr3"
strsh20 = "Gesamt K10"
'For ii = 1 To 3
strPath = "C:\Windows\Temp\"
strFile = strPath & strMitgl(1) & ".xls"
Application.ScreenUpdating = False
Sheets(Array(strMitgl(1), strsh20)).Copy ' 2 Sheets werden ausgewählt
For i = 1 To Sheets.Count
Sheets(i).Activate
Call Verknuepfungen_löschen
Next i
Range("A1").Select ' dient dazu, dass nicht das ganze Blatt Select
Application.CutCopyMode = False
With ActiveWorkbook
.SaveAs strFile
SendenMayr1 strFile ' für jedes Mitglied eigens senden
.Close
End With
Kill strFile 'Datei löschen
'Next ii
Application.ScreenUpdating = True
End Sub
Sub SendenMayr1(AWS As String) ' für jedes Mitglied eigens senden
Dim Nachricht As Object, OutApp As Object
Set OutApp = CreateObject("Outlook.Application")
Set Nachricht = OutApp.CreateItem(0)
With Nachricht
.To = "test@t-online.de"""
.Subject = "Test1"
.attachments.Add AWS
.Body = "Hallo Mayr1," & vbCrLf & vbCrLf & "anbei die zwei Sheets." _
& vbCrLf & vbCrLf & "mfg Erich"
.Display
.Send
End With
End Sub

Besten Dank wenn Du doch noch eine Lösung hast!
mfg
Erich
EXCEL-Shareware und Freeware: http://www.toolex.de
Private Tippgemeinschaft für Lotto oder KENO: http://www.kenostrategen.de
Anzeige
AW: Variable Namen automatisch erkennen
24.10.2005 00:32:47
Erich
Hallo nochmal Erich,
warum stiegst du schon aus - so kurz vor dem Ziel? So sollte es geehen:

Sub MehrMails2()
Dim strPath As String, strFile As String
Dim strMitgl(1 To 20) As String, strAnr(20) As String, strEml(20) As String
Dim strsh20 As String
Dim ii As Integer, jj As Integer
strMitgl(1) = "Mayr1":  strAnr(1) = "Mayr1"
strEml(1) = "test@t-online.de"
strMitgl(2) = "Mayr2":  strAnr(2) = "Willi"
strEml(2) = "test@web.de"
strMitgl(3) = "Mayr3":  strAnr(3) = "Anna"
strEml(3) = "test@gmx.de"
strsh20 = "Gesamt K10"
For ii = 1 To 3
Application.ScreenUpdating = False
Sheets(Array(strMitgl(ii), strsh20)).Copy ' 2 Sheets werden ausgewählt
For jj = 1 To Sheets.Count
Sheets(jj).Activate
Call Verknuepfungen_löschen
Next jj
Application.CutCopyMode = False
strPath = "C:\Windows\Temp\"
strFile = strPath & strMitgl(ii) & ".xls"
With ActiveWorkbook
.SaveAs strFile
Senden strFile, strAnr(ii), strEml(ii)  ' mit 3 Parametern
.Close
End With
Kill strFile 'Datei löschen
Next ii
Application.ScreenUpdating = True
End Sub


Sub Senden(AWS As String, Anred As String, MailAdr As String)
Dim Nachricht As Object, OutApp As Object
Set OutApp = CreateObject("Outlook.Application")
Set Nachricht = OutApp.CreateItem(0)
With Nachricht
.To = MailAdr & """"               ' Muss & """" wirklich da stehen ?
.Subject = "Test1"
.attachments.Add AWS
.Body = "Hallo " & Anred & "," _
& vbCrLf & vbCrLf & "anbei die zwei Sheets." _
& vbCrLf & vbCrLf & "mfg Erich"
.Display
.Send
End With
End Sub


Sub Verknuepfungen_löschen()
' tut was auch immer, dann am Ende:
Range("A1").Select ' dient dazu, dass nicht das ganze Blatt Select
End Sub

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Variable Namen automatisch erkennen
24.10.2005 07:40:35
Erich
Hallo Erich,
........musste aussteigen, das habe ich noch nicht ganz drauf. Werds heute abend testen
und melde mich nochmal - denke aber das passt!
Besten Dank für die schnelle Antwort!
mfg
Erich
EXCEL-Shareware und Freeware: http://www.toolex.de
Private Tippgemeinschaft für Lotto oder KENO: http://www.kenostrategen.de
GIGANTISCH
24.10.2005 20:48:42
Erich
Hallo Erich,
das ist ja super!! Da erspare ich mir eine Menge Zeit!
Den Hinweis ' Muß & """" wirklich da stehen - verstehe ich nicht?
Allerbesten Dank!
mfg
Erich
EXCEL-Shareware und Freeware: http://www.toolex.de
Private Tippgemeinschaft für Lotto oder KENO: http://www.kenostrategen.de
Anzeige
AW: GIGANTISCH ? Na ja...
25.10.2005 00:01:27
Erich
Hallo Erich,
so gigantisch wars nicht: Ich habe dem "Senden" nur noch die Anrede und die Mail-Adresse verpasst, den Anhang hattest du ja schon als Parameter. Ich fand es eben praktischer, Namen, Anrede und Mail-Adresse an einer Stelle zu pflegen, und die ist jetzt im "Hauptprogramm".
(Auch das ist sicher nicht das Gelbe vom Ei: Wenn da öfter Änderungen sind oder die Liste sich vielleicht dynamisch ergibt, würde man diese Daten in eine Tabelle legen und die dann vom Programm lesen lassen.)
Zu dem Hinweis:
Bei deiner Version stand an der Stelle:
.To = "test@t-online.de"""
Damit der Gänsefuß hinter .de erhalten bleibt, habe ich daraus gemacht:
.To = MailAdr & """"
Da war mir noch nicht klar, dass da kein Gänsefuß hingehört. Jetzt weiß ichs, die Zeile sollte einfach sein:
.To = MailAdr
Viel Spaß beim Mailen - und lass aus den 20 Empfängern nicht gleich 20000 werden...
Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: GIGANTISCH ? Na ja...
25.10.2005 07:14:02
Erich
Hallo Erich,
habe jetzt die Daten alle eingestellt. Drei Dinge noch:
1. Die Mitgliederdaten habe ich in der Tabelle "Mails" gespeichert; da kann ich das problemlos
ändern oder ergänzen:
strMitgl(1) = Sheets("Mails").Cells(1, 1): strAnr(1) = Sheets("Mails").Cells(1, 2)
strEml(1) = Sheets("Mails").Cells(1, 3)
2. Ich wollte noch eine Schleife einbauen
For strMitgl 1 To 20
....
Next strMitgl
Das geht aber wahrscheinlich deswegen nicht, weil strMitgl ein String ist.
Kann man trotzdem eine Schleife einbauen? (derzeit habe ich den Code entsprechend oft
untereinander)
3. Wenn die Mails erstellt werden, kommt beim Outlook der Hinweis, dass "jemand versucht
automatisch eine Mail zu versenden.......".
Das wundert mich insofern, weil ich bisher auch schon einen Code hatte, bei dem die Mail
erstellt wurde - dieser Hinweis (mit Zeitverzögerung) kam aber nicht. Kann man den Hinweis
abstellen?
Besten Dank nochmals!
mfg
Erich
EXCEL-Shareware und Freeware: http://www.toolex.de
Private Tippgemeinschaft für Lotto oder KENO: http://www.kenostrategen.de
Anzeige
AW: GIGANTISCH ? Na ja...
25.10.2005 08:12:58
Erich
Hi Erich,
dass du die Empfängerdaten in ein Blatt schreibst, find ich gut!
Die Daten lassen sich schön kurz in einer Schleife lesen:
In A17:C17 stehen die Daten des 17. Mitglieds, also ist
strMitgl(17) = Sheets("Mails").Cells(17, 1)
strAnr(17) = Sheets("Mails").Cells(17, 2)
strEml(17) = Sheets("Mails").Cells(17, 3)
Für das n-te Mitglied sieht das dann so aus:
strMitgl(n) = Sheets("Mails").Cells(n, 1)
strAnr(n) = Sheets("Mails").Cells(n, 2)
strEml(n) = Sheets("Mails").Cells(n, 3)
Für n kannst du 1 bis 20 einsetzen. Das kann auch die Prozedur mit einer Schleife:
For n = 1 to 20
strMitgl(n) = Sheets("Mails").Cells(n, 1)
strAnr(n) = Sheets("Mails").Cells(n, 2)
strEml(n) = Sheets("Mails").Cells(n, 3)
Next n

Statt n kannst du das schon vorhandene ii benutzen.
Und da Faulheit beim Programmieren oft eine Tugend ist (und zu kürzeren, übersichtlicheren Programmen führt), kannst du noch mit "With" das mehrfache Hinschreiben des Blatts vermeiden. Letzlich kann das dann so aussehen:

With Sheets("Mails")
For ii = 1 to 20
strMitgl(ii) = .Cells(ii, 1)
strAnr(ii) = .Cells(ii, 2)
strEml(ii) = .Cells(ii, 3)
Next ii
End With

Zu der Outlook-Meldung kann ich dir nix sagen, mit Outlook habe ich keine Erfahrung, arbeite mit Thunderbird (prima!).

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: GIGANTISCH ? Na ja...
26.10.2005 07:27:42
Erich
Hallo Erich,
besten Dank schon mal; melde mich nochmal wenn ich fertig bin.
mfg
Erich
EXCEL-Shareware und Freeware: http://www.toolex.de
Private Tippgemeinschaft für Lotto oder KENO: http://www.kenostrategen.de
AW: GIGANTISCH ? Na ja...
27.10.2005 20:15:06
Erich
Hallo Erich,
besten Dank für die freundliche und kompetente Erklärung. Jetzt habe ich genau das was ich
schon immer bei diesem Vorgang haben wollte.
(Das Outlook-Problem werde ich über ein entsprechendes Forum lösen)
mfg
Erich
EXCEL-Shareware und Freeware: http://www.toolex.de
Private Tippgemeinschaft für Lotto oder KENO: http://www.kenostrategen.de
AW: Variable Namen automatisch erkennen
23.10.2005 14:10:02
Basti
Hallo zusammen,
dein "Problem" kann eigendlich schön durch die type Anweisung erledigt werden. Mit der type Anweisung kannstr du dir deine Variablen so zurechtschneiden wie du sie brauchts.
bsp.
Type TMitg
Mitglied as String
strsh as String
strName as String
intAlter as Integer
End Type
Dim MList(1 to 20) as TMitg
Aufrufen kannst Du sie dann wie folgt (z.B. Alter des ersten Mitglieds)
Msgbox MList(1).intAlter
Basti

AW: Variable Namen automatisch erkennen
23.10.2005 22:26:22
Erich
Hallo Basti,
besten Dank - werde das auch mal testen.
mfg
Erich
EXCEL-Shareware und Freeware: http://www.toolex.de
Private Tippgemeinschaft für Lotto oder KENO: http://www.kenostrategen.de

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige