Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1300to1304
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
Inhaltsverzeichnis

Daten der Spalte A prüfen;Werte von Datei einlesen

Daten der Spalte A prüfen;Werte von Datei einlesen
10.03.2013 02:02:42
Datei
Hallo in die Runde,
folgenden Sachverhalt würde ich gerne lösen können:
Mir liegt eine Kolonne von EMailadressen vor. Die Adressen stehen in Spalte A (ab Zelle A2). Es sind ca. 300 Stück.
Nun würde ich gerne die Daten meiner Kundendatei (ca. 900 Datensätze in Zeilen) einlesen, wenn die EMail-Adressen übereinstimmen. Auch hier steht die EMail-Adresse in Spalte A. In jeder Zeile der Kundendatei stehen ca. 25 Eintragungen ab Spalte B.
Der Code soll nun die Spalte A prüfen und wenn die EMail-Adressen übereinstimmen, sollen die Werte der Zeile aus der Kundendatei ab Spalte B eingelesen werden.
Ob der Code die Datei zunächst öffnet oder nicht, ist zweitrangig.
Sagen wir die Kundendatei liegt im Ordner *C:/Kunden* und heisst *Kundendaten*
Herzlichen Dank für jede Hilfe!
Viele Grüße
Dietmar aus Aachen

31
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Daten der Spalte A prüfen;Werte von Datei einlesen
10.03.2013 11:48:23
Datei
Hallo Dietmar
schau dir die Datei an. Wie dort auch steht:
Die Formel aus B2 nach rechts kopieren und dann alles nach unten kopieren.
Vielleicht hilft dir das schon mal weiter.
https://www.herber.de/bbs/user/84272.xls
Gruß, Hubert

AW: Zusatzbemerkung
10.03.2013 11:55:50
Hubert
Nochmal Hallo
Ich seh gerade, wenn ich die Datei hier aufrufe:
Statt: ('https://www.herber.de/bbs/user/[Kundendaten.xls]
muss bei dir natürlich: ('C:\Kunden\[Kundendaten.xls]
rein.
Bitte das dann in der B2-Formel abändern und dann kopieren.
Gruß, Hubert

Anzeige
Formel geht klasse ...
10.03.2013 17:45:16
Dietmar
Hallo Hubert,
herzlichen Dank!das geht mit Deiner Formel absolut perfekt.
Wenn es allerdings mit einem VBA-Code ginge, fände ich das noch eine Spur knuffger :-)
Ich lass den Thread deshalb mal auf.
Liebe Grüße und noch einen schönen Restsonntag
Dietmar

AW: Formel geht klasse ...
10.03.2013 22:50:46
Hubert
Hallo Dietmar
freue mich, dass ich dir helfen konnte.
Bei VBA bin ich allerdings auf Level "bescheiden", daher hoffe
ich, dass einer der Experten dir das stricken kann.
Gruß, Hubert

Warum VBA wenns mit Formel geht?
11.03.2013 09:26:49
Klaus
Hallo Dietmar,
an Huberts INDEX Formel ist nichts auszusetzen, ich hätte hier aber eine SVERWEIS Formel genommen.
Warum möchtest du das per VBA lösen, wenn es per Formel so einfach geht? OK, vielleicht brauchst du den Vorgang auf einem Button oder so. Anbei mal ein Code, der dir die gesuchten Werte direkt in die Tabelle schreibt. Im Code verwende ich eine einfache SVERWEIS Formel, statt den ganzen Vorgang zu programmieren. Im Endeffekt macht der Code genau das von Huber vorgeschlagene (Formel schreiben, nach rechts und unten ziehen), nur halt automatisch.
Sub KundendatenEinlesen()
'***** KUNDENDATEI DEFINIEREN *****
Dim sPfad As String
Dim sDatei As String
Dim sTabelle As String
sPfad = "C:\TestTmp"        'ANPASSEN
sDatei = "Kundendaten.xls"  'ANPASSEN
sTabelle = "Tabelle1"       'ANPASSEN
'***** RAHMENBEDINGUNGEN DEFINIEREN ****
Dim iCol As Integer
Dim lRowL As Long
Dim lRowF As Long
Dim iColAnz As Integer
Dim rMail As Range
iCol = 1            'Mailadressen in Spalte 1 (=A)
lRowF = 2           'erste Adresse in Zeile 2 (drüber Überschriften?)
iColAnz = 25        '25 Spalten vergleichen
'**** DATENSÄTZE EINLESEN *****
With ActiveSheet    'ANPASSEN, falls nötig
'letzte Zeile
lRowL = .Cells(.Rows.Count, iCol).End(xlUp).Row
'gesamten Bereich pro Mailadresse durchlaufen
For Each rMail In .Range(.Cells(lRowF, iCol + 1), .Cells(lRowL, iCol + iColAnz))
'Werte per Formel aus Datenbank holen
rMail.FormulaR1C1 = "=VLOOKUP(RC1,'" & sPfad & "\[" & sDatei & "]" & sTabelle & "'! _
R1C1:R65536C" & iColAnz + 1 & "," & rMail.Column & ",)"
'Formel mit Wert ersetzen
rMail.Value = rMail.Value
Next rMail
End With
End Sub
Grüße,
Klaus M.vdT.

Anzeige
Brauche es für ein 'Formelzerstörungs-Genie'
11.03.2013 19:01:00
Dietmar
Hallo Klaus,
du hast schon recht, die Formellösung ist ohne Fehl und Tadel und funktioniert auch bestens.
Ich möchte nicht zuviel lästern, aber ich mache es für eine "Sie" und diese ist ein wahres "Formelzerstörungs-Wunder"
Daher war ich an einer Lösung interessiert, wo "Sie" nichts kaputt machen kann :-), denn die Zellen lassen sich ja nicht schützen, wenn der Formelbereich erweitert werden muss.
Und da es sich hierbei um häufig zu wiederholende Vorgänge handelt, muss ich hier eine 'grobmotoriker-gerechte' Lösung verwenden.
Danke, Dir daher ganz besonders für Deine Lösung! Jetzt ist mir einfach wohler :-)
Viele Grüße
Dietmar

Anzeige
Du kannst doch auch Bereich bzw Zelle ...
11.03.2013 19:20:05
Luc:-?
…per VBA überwachen, Dietmar,
und bei fehlender, zerstörter oder fehlerhafter Formel bzw generell bei Dateistart die Fml da reinschreiben, wo sie hingehört.
Gruß Luc :-?

Gute Idee ... sowie Problem und noch ein Wunsch
11.03.2013 22:28:06
Dietmar
Hallo Luc,
das stimmt, bin ich aber gar nicht drauf gekommen.
Tolle Idee, obwohl ich gestehen muss, dass mir der VBA-Code sehr sympatisch ist.
'Kleines Problem
Der Code von Klaus funktioniert prima.
Allerdings wird in Spalte G kein Wert eingetragen, sondern dort steht nur die VLOOKUP-Formel; aber das passiert immer nur dort.
Ich habe alle Drehschrauben, die ich erahnen konnte gedreht es bleibt bei dem Fehler. Es ist immer nur in Spalte G. Wenn ich nur bis Spalte F übertragen lasse ist alles ok. Aber selbst wenn ich iColAnz = 9 mache ist Spalte 7 (G) wieder nur mit der Formel befüllt; ab Spalte 8 ist es wieder ok.
'Ergänzungswunsch
Dann wäre ich noch für eine weitere "Drehschraube" dankbar: Ich möchte noch einstellen können, dass der Übertrag hinsichtlich der 1. zu berücksichtigenden Spalte definiert werden kann (so: prüfe die Spalte A und übertrage dann die Daten ab der Spalte E).
Schon jetzt ganz lieben Dank!
Muss es mal wieder loswerden: Ich find das hier im Forum immer wieder klasse wie toll man hier Hilfe bekommt!
Viele Grüße
Dietmar

Anzeige
Problem gelöst ... nur noch Wunsch offen
11.03.2013 22:36:01
Dietmar
Hallo Luc,
Problem mit dem Eintrag der Formeln in Spalte G (anstatt dem Wert) ist gelöst. Ich hatte diese ganze Spalte als Text formatiert.
Bleibt nur noch mein Wunsch, vorgeben zu können, dass der Übertrag der Daten ab Spalte xy stattfinden soll. Näher erklärt in Beitrag von eben.
Danke!
Viele Grüße
Dietmar

Da will ich Klaus aber nicht reinpgmieren! ;-) orT
11.03.2013 23:35:54
Luc:-?
Nur, falls er nicht dazu kommt!
Gruß Luc :-?

An Klaus ...
11.03.2013 23:57:30
Dietmar
Hallo Klaus,
Luc:-? überlässt Dir den Vortritt :-)
Ich genieße Deinen Code total!
Habe neben dem Wunsch die Spalte bestimmen zu wollen, aber der die Daten übertragen werden sollen (die Zeile geht ja schon), noch etwas, was mir gerade aufgefallen ist:
Wenn einzelne Felder der Quelldatei leer sind, erscheint eine 0; in einem Datumsfeld erscheint 12:00:00 AM.
Es wäre also toll, wenn statt der 0 bzw. 12:00:00 AM gar nichts drin stände.
Besten Dank!
Viele Grüße
Dietmar

Anzeige
AW: An Klaus ...
12.03.2013 08:42:12
Klaus
Guten Morgen zusammen,
dem Wunsch die Spalte bestimmen zu wollen
Erfüllt: die Variablen dazu heissen iColAb und iVersatz. Erklärung unten.
in einem Datumsfeld erscheint 12:00:00 AM.
Ich behaupte mal, du vertust dich hier. Davon abgesehen dass dies eine UHRZEIT ist (ok, für Excel ist eine Uhrzeit sogar ein Datum) müsste in der Zelle 00:00:00 AM stehen. 12:00:00 AM währe 0,5 und nicht 0.
Es wäre also toll, wenn statt der 0 bzw. 12:00:00 AM gar nichts drin stände.
Erledigt.
Luc:-? überlässt Dir den Vortritt :-)
Oder er versteht den Code nicht ;-) ;-)
Sub KundendatenEinlesen()
'***** KUNDENDATEI DEFINIEREN *****
Dim sPfad As String
Dim sDatei As String
Dim sTabelle As String
sPfad = "C:\TestTmp"        'ANPASSEN
sDatei = "Kundendaten.xls"  'ANPASSEN
sTabelle = "Tabelle1"       'ANPASSEN
'***** RAHMENBEDINGUNGEN DEFINIEREN ****
Dim iCol As Integer
Dim iColAb As Integer
Dim lRowL As Long
Dim lRowF As Long
Dim iColAnz As Integer
Dim rMail As Range
Dim iVersatz As Integer
iCol = 1            'Mailadressen in Spalte 1 (=A)
lRowF = 2           'erste Adresse in Zeile 2 (drüber Überschriften?)
iColAnz = 25        '25 Spalten vergleichen
iColAb = 4          'Trage Werte ab Spalte 2 ein
iVersatz = 2        'Versatz der Spalten im Vergleich zur Datenbank
'**** DATENSÄTZE EINLESEN *****
With ActiveSheet    'ANPASSEN, falls nötig
'letzte Zeile
lRowL = .Cells(.Rows.Count, iCol).End(xlUp).Row
'gesamten Bereich pro Mailadresse durchlaufen
For Each rMail In .Range(.Cells(lRowF, iColAb), .Cells(lRowL, iColAb + iColAnz))
'Werte per Formel aus Datenbank holen
rMail.FormulaR1C1 = _
"=VLOOKUP(RC1,'" & sPfad & "\[" & sDatei & "]" & sTabelle & "'!R1C1:R65536C256," _
& rMail.Column - iVersatz & ",)"
If rMail.Value = 0 Then
'Verweis-Nullen in nichts verwandeln
rMail.Value = ""
Else
'Formel mit Wert ersetzen
rMail.Value = rMail.Value
End If
Next rMail
End With
End Sub
Erklärung iVersatz:
Wenn das Makro "Düsseldorf" ziehen soll, aber stattdessen "40210" zieht (also die PLZ statt dem Ort),
dann ist der Versatz der Spalten zur Datenbank um 1 falsch. iVersatz muss dann entsprechend erhöht werden.
BEISPIEL:
Die Werte werden ab Spalte 4 eingetragen. In der Datenbank stehen die Werte aber ab Spalte 2.
iVersatz ist nun 2, da es zwei Spalten Differenz zwischen Datenbank und Ausgabe gibt.
ich HÄTTE iVersatz auch fix auf iColAb - 2 setzen können, aber ich meine so ist der Code flexibler
an deine Bedürfnisse anpassbar
Pendantische Anmerkung:
Der Versatz + die Anzahl der aus der Datenbank auszulesenden Spalten
dürfen in Summe niemals mehr als 255 ergeben!
sprich, bei 25 Spalten darfst du unter Excel 2003 bis maximal Spalte HW verschieben.
Eine Fehlerbehandlung dafür spare ich mir aber. (Hol dir Xl2010, da gibts 16.000 Spalten)
Grüße,
Klaus M.vdT.

Anzeige
...Det war wohl nischt, Klaus! ;-]] Gruß owT
12.03.2013 11:13:20
Luc:-?
:-?

Einfach nur KLASSE ! DANKE!
12.03.2013 12:29:50
Dietmar
Hallo Klaus,
Ich bin restlos begeistert!
1000 Dank für diesen Hammer-Code.
Er deckt jetzt all meine Bedürfnisse ab!
Mit dem Versatz das klappt auch. Ich sichere es dann aber durch Probieren ab.
Liebe Grüße aus dem Schnee-Choas in Aachen
Dietmar

Danke für die Rückmeldung! owT.
12.03.2013 14:50:44
Klaus
.

Dieser Ansatz von Luc ...
12.03.2013 11:32:42
Luc
Hallo Luc,
…per VBA überwachen
Was genau meinst du damit? Bei Workbook_Change abfragen, ob im geschützen Bereich etwas passiert und dann .... ?
Genauso pragmatisch könnte man einfach cells.unprotect, dann die Formeln .protect und den Blattschutz an ... aber wenn die pragmatischen Lösungen anfangen, haben wir hier ja nichts mehr zu programmieren :-)
Grüße,
Klaus M.vdT.

Anzeige
Hat sich ja durch Deinen Code erledigt owT
12.03.2013 12:31:43
Dietmar
_

Eben, war schon ausreichend - läuft immer! owT
12.03.2013 14:10:42
Luc:-?
:-?

Nö! AW: Hat sich ja durch Deinen Code erledigt owT
12.03.2013 14:55:33
Klaus
Hallo Dietmar,
hat sich für dich erledigt, ja. Aber micht interessiert Luc's Idee aus akademischen Gründen! Bin ja auch hier um zu lernen :-)
Luc:-?,
Ich hab versucht eine Überwachung im Worksheet.Change zu basteln, aber der Befehl "application.undo" scheint mir falsch in Erinnerung zu sein (oder das gibts nicht mehr) .... und CANCEL gibts im Change_Ereigniss auch nicht.
Meine Idee war: wenn der User im Formelbereich irgendwas überschreibt, drücke die "UNDO" Taste um die Formel wieder herzustellen.
Natürlich könnte ich im selben Ereigniss die Formel auch neu schreiben, aber vielleicht will ich ja in Zukunft einen größeren Bereich mit diversen Formeln überwachen - daher die UNDO Idee.
Wenns dir nicht zu viel Mühe macht, hilfst du mir da auf die Sprünge? Ich hab solche Lösungen gern "auf Vorrat" (landen auf dem USB-Stick) und nutze sie auch, wenn auch nicht sofort.
Grüße,
Klaus M.vdT.

Anzeige
Frag' bei Mappenstart oder Blattaktivierung ...
12.03.2013 19:13:54
Luc:-?
…die fraglichen Zellen mit .HasFormula oder ggf auch mit IsError() ab (dann evtl noch mit Original vgl), Klaus,
und mache davon den FmlEintrag abhängig (FmlText am besten als Konstante anlegen, erleichtert nachträgliche Korrekturen → sollte man grundsätzlich für im Pgm benutzte Konstt machen!).
Falls du mehr Infos benötigen solltest — ich habe da ein freies Komplettprojekt (f.1 HB-Trainer, der dir sogar etwas ähnlich sieht), das aber noch nicht ganz fertig ist (Stand 2012/01 mit über 20 MB, 30 TabBlätter — komme aber zZ nur an den Stand 2011/08) → da hättest du wahrscheinlich jede Menge Anregungen (in bestimmtem Maß auch dazu)… ;-)
Hier hochladen könnte ich wohl höchstens die zugehörige Projekthilfe als .txt oder .rtf, sonst alles nur per eMail, die du allerdings im Profil nicht angegeben hast.
Übrigens, die Chaoten, die Fmln überschreiben (Typ Sekretär/in), merken das meist/oft gar nicht, drücken dann also auch kaum oder zu spät Undo.
Gruß Luc :-?

Anzeige
AW: Frag' bei Mappenstart oder Blattaktivierung ...
13.03.2013 08:09:12
Klaus
Hi Luc,
an dem Projekt wäre ich interessiert, ich finde aber bestimmt nicht die Zeit mich in ein ganzes Projekt reinzuarbeiten. Der Gedankenansatz hilft mir aber schonmal (Formeln als Konstanten - gute Idee!) und wenn ich das im kleinen selbst umsetze hab ich da auf Dauer warscheinlich mehr Lerneffekt von.
drücken dann also auch kaum oder zu spät Undo.
Genau. Darum wollte ich ja, dass der Computer Undo drückt. Meine Idee in Pseudocode:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rBereichSchutz As Range
Set rBereichSchutz = Range("C2:F7")
If Not Intersect(Target, rBereichSchutz) Is Nothing Then
drücke automatisch auf den UNDO Button, Zelleneintrag wird somit wiederhergestellt
End If
End Sub

Aber das bekomme ich nicht zum laufen.
Grüße,
Klaus M.vdT.

AW: Frag' bei Mappenstart oder Blattaktivierung ...
13.03.2013 08:21:30
hary
Moin Klaus
Meinst du wenn du im Bereich etwas haendisch ueberschreibst und soll zurueckgesetzt werden?
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rBereichSchutz As Range
Set rBereichSchutz = Range("C2:F7")
If Not Intersect(Target, rBereichSchutz) Is Nothing Then
Application.EnableEvents = False
Application.Undo
End If
Application.EnableEvents = True
End Sub

Gruss hary

Danke sehr Hary!
13.03.2013 08:30:35
Klaus
Hi,
ja, exakt das meinte ich. Hat bei mir nie funktioniert.
Beim genauen hinsehen habe ich aber schlicht das "Application.EnableEvents = False" vergessen, peinlich ...
Danke für die Musterlösung,
Grüße,
Klaus M.vdT.
Luc, das mit den "Formeln-Konstanten" probier ich trotzdem. Diese Lösung wird ja durch "ohne Makros" ausgehebelt.

Ja, dann stehen die wenigstens noch woanders ...
13.03.2013 12:23:14
Luc:-?
…und können nicht so leicht ganz verloren gehen, Klaus;
man könnte die natürlich auch in einer Projektdokumentation halten und bei Bedarf dort abrufen. Aber das macht 'ne Menge Arbeit, so dass ich das im erwähnten Projekt (trotz diverser Hilfsmittel) auch nur teilweise getan habe.
Ich werde mal sehen (muss erst auf Win umschalten), ob ich die ProjektDoku/-Hilfe hochladen kann. Falls es klappt, stelle ich dir auf Wunsch den Link ein. Danach kannst du immer noch entscheiden… Aber wie gesagt, ist nicht der letzte Stand und ohnehin unfertig, trotzdem Tsde CodeZeilen — möglicherweise sind die sicherheitsbezogenen „Projekttücken“ schon aktiv (natürlich nicht in der Doku!). ;-)
Gruß Luc :-?

An Luc und Klaus ... Wie Fehler abfangen?
14.03.2013 18:34:01
Dietmar
Hallo Luc und hallo Klaus,
ich wende mich mal an Euch beide, da ihr mir so prima geholten habt.
Habe den Code in der Praxis testen können. Läuft gut durch. Habe noch Application.Screenupdating = false davorgeschaltet, weil es dann bei langen Listen (doch bis zu 2000 Zeilen) dann schneller geht.
Folgende beiden Problemfelder haben sich aufgetan:
Problem 1:
Wenn eine EMail-Adresse in der Import-Datei in Spalte A aufgeführt ist, die es in der zu überprüfenden Datei NICHT GIBT, stoppt der Code mit Hinweis auf *Fehler 13, Typenunverträglichkeit*
Anliegen:
Hier müsste der Code dann in der nächsten Zeile weitermachen.
Problem 2:
Wenn in der Spalte A nicht durchgängig Einträge vorhanden sind (EMail-Adressen); wenn also dazwischen eine Leerzelle ohne Eintrag vorkomment, hängt der Code sich mit dem Hinweis *Laufzeitfehler 13, Typenunverträglichkeit" auch auf.
Anliegen:
Wie oben.
Für eine Absicherung des tollen Codes wäre ich sehr dankbar!
Viele Grüße
Dietmar aus Aachen

Fehler abfangen indem man zB VOR ...
15.03.2013 02:19:53
Luc:-?
…den jeweiligen PgmBlock On Error Resume Next und danach wieder On Error GoTo 0 setzt, Dietmar;
allerdings könnten dann noch woanders Fehler auftreten, die nicht abgefangen wdn, weshalb ich gern auch eine generelle F-Behdl verwende, denn es ist wenig schön, wenn sich bei einem fertigen Pgm im Firmeneinsatz bei MA xy, der von VBA womöglich kA hat, entweder plötzlich der VBE öffnet oder bei geschütztem VBA-Projekt die kryptische Mitteilung erscheint „Fehler in verborgenem Modul“! Da denkt der arme MA womöglich sonstwas… ;-)
Eine generelle F-Bhdl erreicht man mit einem On Error GoTo fmarke (⇒Name der entsprd Marke). Vor dieser Marke (am linken Rand mit anschließendem Trenn-:) steht idR ein Sprungbefehl zur Endbehdl des Pgms, danach (ggf in der gleichen Zeile) beginnen die F-Bhdlsroutinen. Hier könntest du auch bestimmte Fehler ausfiltern und ggf mit einem Resume Next zur nächsten Anweisung nach dem Auftreten des Fehlers zurückkehren. Ansonsten lass' ggf eine MsgBox erscheinen, die den Fehler angibt → Err.Description u/o eigenen Text. Im Titel der Box verwende ich gerne den Namen des Pgms nebst Text Fehler + Err.Number. Letztere zickt mitunter, wenn man damit noch Anderes machen will (ist dann plötzlich 0).
Ohne solche F-Bhdl Err.Number am Ende evtl noch auf 0 setzen, weil der Fehler gern auch an aufrufende Pgmm weitergereicht wird. Wenn die eine F-Bhdl haben, wird sie auch wirksam, was dich raten lässt, wo der Fehler nun wirklich aufgetreten ist.
Morrn, Luc :-?

On Error Resume Next geht ....
15.03.2013 09:39:29
Dietmar
Hallo Luc,
ganz lieben Dank für Deine Hilfe.
Ich hatte noch bis spät in die Nacht an dem Problem herumgedoktert und war auf die Idee mit On Error Resume Next* auch schon gekommen (Hurra, ich hab schon was dazugelernt.
Das funzt auch gut und ich denke, damit könnte ich gut leben.
Habe gesehen, dass Klaus mir auch geantwortet hat, schaue jetzt mal was der *Vater des Codes* :-)) dazu zu sagen hat.
Toll finde ich, dass Du mir das mit den Fehlerabfang-Codes so gut erklärt hast. Ich hab mir immer mal vorgenommen, mich damit ausführlicher zu beschäftigen, weil es ja irgendwie doof ist, wenn ein toller Code durch einen nicht vorhersehbaren Sonderfall auf einmal eine nichtssagende Fehlermeldung produziert.
Wünsche Dir einen schönen Tag!
Viele Grüße
Dietmar

AW: An Luc und Klaus ... Wie Fehler abfangen?
15.03.2013 09:05:30
Klaus
Hallo Dietmar,
Luc hat natürlich komplett recht mit seiner Ansage über generelle Fehlerbehandlung. Aber unseren Code hat er ja nicht verstanden :-)
In deinem Fall kommt der Fehler ja bekanntermaßen daher, dass diese Zeile
rMail.FormulaR1C1 = _
"=VLOOKUP(RC1,'" & sPfad & "\[" & sDatei & "]" & sTabelle & "'!R1C1:R65536C256," _
& rMail.Column - iVersatz & ",)"

als Formelergebnis #NV! in die Tabelle zurück schreibt.
Das NV kann man aber direkt in der Formel verhindern:
rMail.FormulaR1C1 = _
"=IF(ISNA(VLOOKUP(RC1,'" & sPfad & "\[" & sDatei & "]" & sTabelle & "'!R1C1:R65536C256," & rMail.Column - iVersatz & ",)),0,VLOOKUP(RC1,'" & sPfad & "\[" & sDatei & "]" & sTabelle & "'!R1C1:R65536C256," & rMail.Column - iVersatz & ",))"

Tausch die Zeile einfach aus und probiers nochmal! (korrigiere ggf die Zeilenumbrüche)
(da du XL2003 angegeben hast, musste ich die umständliche lange Version einsetzen. Unter Xl2007 währ die Formel nur halb so lang! Upgrade?)
Grüße,
Klaus M.vdT.

Nun PERFEKT ... ist es schädlich wenn ...
15.03.2013 09:47:22
Dietmar
Hallo Klaus,
habe Luc gerade auf seine Info geantwortet und kam mit seiner Lösung auch schon ganz gut klar (wie ich fand).
Nun habe ich Deinen If-Code durchlaufen lassen. - Und was soll ich sagen: er läuft schnurrend wie ein Kätzchen durch :-) WOW!
Was denkst Du?
Sind damit alle Eventualitäten, die ein DAU produzieren kann, berücksichtigt?
Oder, soll ich am Anfang des Codes noch *On Error goto fehler* und am Ende dann die Fehlerabfangroutine einbauen? Oder ist das eher schädlich bzw. stört es den Code? (lasse den Thread daher nochmal offen, bis ich Dein Feedback habe).
Jedenfalls, auch hier wieder 1000 Dank!
Dir noch einen schönen Tag!
Viele Grüße
Dietmar

AW: Nun PERFEKT ... ist es schädlich wenn ...
15.03.2013 10:14:16
Klaus
Hi Dietmar,
Sind damit alle Eventualitäten, die ein DAU produzieren kann, berücksichtigt?
Nein. Nie. Da kann bestimmt jeder ein paar Stories erzählen.
Bei mir hat mal jemand in eine Zelle folgendes "Datum" eingetragen:
"12.Januar, Freitag, aber das Material kommt schon Donnerstag mittag!" und sich dann beschwert, dass die automatische Produktionszeit-Berechnung nicht mehr funktioniert. Wer kommt darauf? Seitdem versehe ich JEDE Datums-Zelle mit einer Gültigkeitsprüfung.
Oder, soll ich am Anfang des Codes noch *On Error goto fehler* und am Ende dann die Fehlerabfangroutine einbauen?
Guten Gewissens kann ich nur sagen: Bau eine Fehlerbehandlung ein! Eigentlich soll man das immer machen. Eigentlich. Ich halte das so: "Wenn der Code funktioniert, braucht er keine Fehlerbehandlung". Aber ich telefoniere auch beim Autofahren mit dem Handy ...
Oder ist das eher schädlich bzw. stört es den Code?
Nö, den Code stört das nicht. Solange keine Fehler vorkommen, greift die Fehlerbehandlung ja nicht. Und wenn sie greift, stört sie den Code sicherlich nicht weniger als der Fehler selbst.
Jedenfalls, auch hier wieder 1000 Dank!
Dir noch einen schönen Tag!

Na, dann danke für die Rückmeldung und dir ein schönes Wochenende!
Grüße,
Klaus M.vdT.

Code verstanden oder nicht, besser - nicht ...
15.03.2013 17:27:50
Luc:-?
…en detail mit beschäftigt, Klaus… ;-)
Ansonsten entsteht normalerweise kein PgmFehler durch die F-Wert-Lieferung einer ZellFml. Auch das Auslesen von F-Werten führt nicht automatisch zu einem PgmFehler. Nur, wenn man statt mit WorksheetFunction nur mit Application im Pgm arbeitet, erhält man F-Werte, die bei Zuweisung an einen nicht-varianten Variablentyp einen PgmFehler auslösen dürften.
Alles andere hast du Dietmar ja auch richtig empfohlen, wie zB auch die F-Vermeidung. ;-)
Gruß Luc :-?

302 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige