excel vba range bereich aus werten 2er Spalten angeben?

1 Antwort

Die Löschlogik habe ich noch nicht ganz durchschaut.

Aber deine Idee mit der Schleife ist gut, außerdem würde ich nur zusammenhängende Zellbereiche in einem Befehl leeren. Dann hast du mehrere Zeilen im VBA-Editor, aber kostet ja nichts.

Wenn du eine Schleife verwendest, zum Beispiel eine indizierte For-Schleife, dann würde ich die Zellbereiche mit Cells referenzieren.

Du musst dir aber zuallererst eine Logik überlegen, wie sich rechnerisch die Bereiche von einer Startsituation aus ergeben, die geleert werden sollen.


BlackMamba666 
Beitragsersteller
 27.09.2017, 10:05

zusammenhängende Zellbereiche


Ist leider nicht möglich deswegen ja auch die Adress-Ermittlung dieser 2 Spalten.

Warum das Löschen? Weil es sich um ein Formular handelt wo User Einträge in verschiedenen Feldern eingeben. Diese Felder erweitern sich jedoch mit der Zeit wodurch es Dynamisch sein sollte.

Deine Aussage

Wenn du eine Schleife verwendest, zum Beispiel eine indizierte
For-Schleife, dann würde ich die Zellbereiche mit Cells referenzieren.

versteh ich nur in der Teorie aber es in die Praxis umzusetzen dazu fehlt es mir an Wissen deswegen die Frage ja.

Was die Bereiche die ermittelt werden sollen, das passiert schon in diesen 2 Spalten P und Q. Ich muß diese Werte ja in ein Array übermitteln. Aber selbst da scheitert es an Wissen bei mir schon. Ganz geschweige dann mit der Schleife.

Ich bin gerne Bereit dafür auch mal länger drann zu sitzen und nachzuschlagen, aber ich suche schon seit einer Woche im Netz nach einer Lösungfinde aber nichts das ich a verstehe und b mir weiter hilft. Allerdings muss das ganze jetzt fertig werden. (frist bis morgen) und ich muss noch Tests durchlaufen lassen und Feinabstimmungen etc.

Sprich wenn möglich bitte mit Code-Beispielen - oder wegen Zeit der fertige Code dafür. (letzteres bin ich normalerweise auch nicht dafür aber mir drängt die Zeit)

0
Suboptimierer  27.09.2017, 12:26
@BlackMamba666

Das Problem ist, dass ich schwer abschätzen kann, welche Bereiche nicht geleert werden dürfen. Sonst könnte man ja stumpf die kompletten Spalten leeren.

Range("P:Q").Clear

heute ist es z.B. A:1 und C:22, morgen kommt noch B:33 und D:8 hinzu.

Wenn jede 11. Zeile ab C22 geleert werden soll, bis zur zuletzt gefüllten Zelle:

For i=11 To Range("C:C").End(xlUp).Row Step 11
  Range("C"&i).Clear
Next

(ungetestet)

Wie gesagt ist es am wichtigsten, dass du dir eine Löschlogik überlegst. Man kann nicht loslegen, etwas zu programmieren, wenn man gar nicht weiß, nach welchen Regeln das Programm vorgehen soll.

0
BlackMamba666 
Beitragsersteller
 27.09.2017, 13:04
@Suboptimierer

sorry dachte es wäre klar was ich meinte.

Alle Zellen deren Kordinaten in P und Q stehen müssen gelöscht werden. Wobei dann P die Spalten als Buchstaben hat und Q die Zeile. Wenn da Zellen angegeben sind die nicht gelöscht werden dürten dann hätte ich einen Fehler in den Formeln. Kann ich aber nach ausgiebigen Tests verneinen.

Was ggf. noch wichtig ist, dass es auch sein kann, dass Sich Zeilen in P&Q befinden, die Leer sind was aber so richtig ist. P&Q sind Bestandteil einer intelliegenten Tabelle wodurch ich, als Besipiel

=VERKETTEN([@[Koordinate a]];[@[Koordinate b]])

verwenden kann (also der Name Koordinate a stimmt auch jedoch ist es hier als einzelne Formel angegeben in meiner Datei ist er verschachtelt). Was ich zum unter anderem auch in anderen Feldern so mache. Ich weis aber auch nicht, wie ich diese Daten ins Array bekomme.

Ich versuch es mal so:

Spalte P       Spalte Q

a                    22

g                    45

b                    23

Diese werte werden als Beispiel gelistet. VBA soll nun auslesen, was alles in Koordinate a steht und was in Koordinate b steht und es so als Array speichern

a:22;g:45;b:23

danach dann die Schleife wo dieses Array als Koordinaten dient.

somit werden dann die Zellen in A:22 sowie G:45 und B23 gelöscht (also löschen im Sinne von Werte löschen ;) )

0
Suboptimierer  27.09.2017, 13:17
@BlackMamba666

Sind die Spalten P und Q lückenlos, ohne Leerzeilen dazwischen?

Dann reicht eine einfache Schleife:

i = 1
On Error GoTo Next While Range("P"&i).Value <> "" And Range("Q"&i).VAlue <> "" Range( Range("P"&i).Value & Range("Q"&i).Value ).Clear i = i+1 Wend

(ungetestet)

Während du testest, könntest du noch den On Error Befehl heraus nehmen, damit du siehst, wie häufig ein Fehler auftritt.

0
BlackMamba666 
Beitragsersteller
 27.09.2017, 14:19
@Suboptimierer

nein sind nicht lückenlos. sagte ja oben


Was ggf. noch wichtig ist, dass es auch sein kann, dass Sich Zeilen in P&Q befinden, die Leer sind was aber so richtig ist.

Wenn jedoch leer dann sind 100%ig beide leer falls das relevant ist.

Also nicht die ganze Spalte sondern was ich meine ist, dass wenn z.B bei P:77 ein Eintrag steht dann P:78 nichts aber dann wieder bei P:79 was steht, dann ist es exakt genauso bei Spalte Q. Sprich es unterscheidet sich nur darin, dass das eine Die Zielspaltenberechnung ist und das Andere die Zielzeileberechnung.


Während du testest, könntest du noch den On Error Befehl heraus nehmen, damit du siehst, wie häufig ein Fehler auftritt.

Du meinst dann im VBA aber wie bzw. wo mach ich das?
Und vor allem; wo beschreibst du das Array in deinem Code?

0
Suboptimierer  27.09.2017, 14:25
@BlackMamba666

Mit einem Array würdest du es dir meines Erachtens zu umständlich machen. Das erzeugt viel Code. Viel Code ist viel mehr fehleranfällig.

Wenn du das Ende der Liste nicht am ersten leeren Element festmachen kannst, könntest du nach dem letzten nichtleeren Element suchen.

Dann verwendest du die Schleifenbedingung wie oben beschrieben und machst aus der While-Schleife eine For-Schleife:

For i=1 To Range("P:P").End(xlUp).Row
0
Suboptimierer  27.09.2017, 14:33
@Suboptimierer

Du kannst auch, wenn du weißt, dass in Spalte P maximal 10000 Zeilen gefüllt sind, einfach alle 10000 Zeilen abfragen.

For i=1 To 10000
  If Not IsEmpty(Range("P"&i)) Then
0
BlackMamba666 
Beitragsersteller
 27.09.2017, 14:40
@Suboptimierer

ok das ging schnell. Aber ich merke ich habe was ausgelassen, wenn ich deinen Post richtig verstehe.

Du meintest:

Wenn du das Ende der Liste nicht am ersten leeren Element festmachen kannst, könntest du nach dem letzten nichtleeren Element suchen.

es würde dann nachdem letzten jemals beschrieben Zeile suchen und da dann schluss machen oder wie?

Achtung falls es zwischen denn Werten gemeint ist, Es kann auch sein, dass mal mehr als eine Zeile bei P&Q leer sind. Eine genaue Anzahl kann ich nicht nennen, da dies aus einer Auswertung zustandekommt. Also gut möglich, dass mal 4 oder mehr Zeilen nichts kommt und dann wieder weitergeht.

0
Suboptimierer  27.09.2017, 14:42
@Suboptimierer

Du könntest eventuell auch mit UsedRange arbeiten, um die letzte Zeile herauszufinden oder in einer Extrazelle über eine Excelfunktion:

=MAX(ZEILE(P:P)*(P:P<>""))

(als Matrixfunktion)

0
BlackMamba666 
Beitragsersteller
 27.09.2017, 14:43
@Suboptimierer

@ Suboptimierer:
Das funktioniert leider nicht, da mir das nicht bekannt ist wieviel da in Zukunft noch kommt.

Dennoch Danke

0
BlackMamba666 
Beitragsersteller
 27.09.2017, 15:10
@Suboptimierer

was ich machen könnte wäre anhand der Intelligenten Tabelle herausfinden, wieviele Zeilen diese hat und diese dann als Wert für eine Schleife nutzen. Die Frage ist jedoch was passiert mit dem Code?

Du schriebst ja:

i = 1
On Error GoTo Next
While Range("P"&i).Value <> "" And Range("Q"&i).VAlue <> ""
Range( Range("P"&i).Value & Range("Q"&i).Value ).Clear
i = i+1
Wend

Ich denke mal das am Ende soll end sein und nicht Wend^^

Aber hier verwendest du doch eine While-Schleife und sagst, dass er solange durchläuft bis er bei beiden also P&Q leere Felder findet. Dann stoppt die Schleife. Oder versteh ich da jetzt was Falsch?

Die andere Frage ist, prüft er in dem Bereich der While-Schleife ("P"&i) ob die Zeile XX (XX für die andgabe der Variable) der Spalte P ungleich leer ist (gleiches mit Q).

Wenn ich damit richtig liege dann versteh ich warum du gemeint hast kein Array. Es wird ja dann hier schon gemacht.

Bitte nicht übel nehmen aber ich möchte auch verstehen.

0
Suboptimierer  27.09.2017, 15:20
@BlackMamba666

Ich denke mal das am Ende soll end sein und nicht Wend^^

Nein. Eine While-Schleife wird mit Wend (Eselsbrücke "Kehrtwende") am Fuß begrenzt.

Ja, du hast richtig verstanden, dass die Schleife stoppt, wenn sobald die Zelle in P oder Q leer ist. Da du das nicht willst, habe ich noch andere Vorschläge gemacht.

Am aller-aller-simpelsten ist der Vorschlag mit der Excelformel.

Schreib z. B. in XY1 hinein:

=MAX(ZEILE(P:P)*(P:P<>""))

Die Formeleingabe schließt du mit Strg + Shift + Enter ab.

Dann geht deine Schleife bis zu diesem Wert.

For i=1 To Range("XY1").Value 
  If Range("P"&i).Value <> "" Then
    '...
  End If
Next
0
BlackMamba666 
Beitragsersteller
 27.09.2017, 15:26
@BlackMamba666

ok habe es ausprobiert und bekomme Fehler weil Verbundene Zellen vorhanden sind. Auch darf er nur die Einträge löschen nicht die Formatierung der Zellen. Sprich wenn sie blau ist muss sie Blau bleiben, nur der Wert muss gelöscht werden. Sry vergessen zu erwähnen. Ist es Trotz Verbundenen Zellen möglich?

0
Suboptimierer  27.09.2017, 15:29
@BlackMamba666

Bei verbundenen Zellen steht der Wert in der linken oberen Adresse.

Falls .Clear auch Formate löscht (habe ich nicht getestet), dann kannst du den Wert mit Range(...).Value = "" auf leer setzen.
______________

PS: Meine End(xlUp)-Variante des Schleifenkopfs muss ich korrigieren:

For i = 1 To Range("P" & Rows.Count).End(xlUp).Row
0
BlackMamba666 
Beitragsersteller
 27.09.2017, 16:54
@Suboptimierer

ok danke sorry hatte zu tun, Werde es morgen dann nochmals versuchen. Melde mich dann ob es ging oder nicht. Aber egal wie es ausgeht, danke für die Unterstützung.

1
BlackMamba666 
Beitragsersteller
 27.09.2017, 18:51
@Suboptimierer


habs jetzt doch mal von Zuhause aus gestartet ;)

folgendes hab isch eingegeben:


i = 5
'On Error GoTo Next
While Range("P"&i).Value <> "" And Range("Q"&i).VAlue <> ""
Range( Range("P"&i).Value & Range("Q"&i).Value ).Clear
i = i+1
Wend


i=5 weil es erst in Zeile 5 beginnt
On Error ausdokumentiert, da es einen Fehler verursachte und Meckerte er will kein Next er will ne Zahl.

Was jetzt seltsam ist.
Auf der Arbeit hat er gemeckert wenn ich den Code auslösste von wegen diesen verbundenen Zellen. Bei mir Zuhause geht das jedoch FAST richtig (aber nur fast ;) )

Also was er bei mir Zuhause gemacht hat ist:
- alles gelöscht (Werte & Formatierung)
- Verbundene Zellen wieder getrennt

Er soll aber nur die Werte löschen sonst nichts die Verbundenen Zellen MÜSSEN weiterhin verbunden bleiben und auch ihre Färbung beibehalten.

du schriebst grad eben:

Falls .Clear auch Formate löscht (habe ich nicht getestet), dann kannst du den Wert mit Range(...).Value = "" auf leer setzen.

Wenn ich das so eingebe:

i = 5
'On Error GoTo Next
While Range("P"&i).Value <> "" And Range("Q"&i).VAlue <> ""
Range( Range("P"&i).Value = "" & Range("Q"&i).Value = "").Clear
i = i+1
Wend


passiert gar nichts mehr. Oder ich habe deine Aussage falsch verstanden.

Sorry wollte deinen Text als Zitat einfügen aber diese Seite spinnt damit echt rum.

0
BlackMamba666 
Beitragsersteller
 27.09.2017, 18:53
@BlackMamba666

Ach und habe es kurz vor Feierabend noch geändert! Es kommen jetzt keine leeren Felder mehr vor. Definitiv nicht.

Deshalb bin ich bei diesem Code geblieben.

0
Suboptimierer  27.09.2017, 18:57
@BlackMamba666

On Error ausdokumentiert, da es einen Fehler verursachte und Meckerte er will kein Next er will ne Zahl.

Tschuldigung. Es müsste "Resume Next" heißen. Beim Testen würde ich die Zeile sowieso rausnehmen.
_______________________

Die erste Zeile in der Schleife müsste so lauten:

Range( Range("P"&i).Value & Range("Q"&i).Value ) = ""


0
BlackMamba666 
Beitragsersteller
 27.09.2017, 19:49
@Suboptimierer

Also nochmals getestet und denke mal den wo du meintest auskomentiert.

i = 5
'On Error GoTo Next
While Range("P" & i).Value <> "" And Range("Q" & i).Value <> ""
'Range(Range("P" & i).Value & Range("Q" & i).Value).Clear
Range(Range("P" & i).Value & Range("Q" & i).Value) = ""
i = i + 1
Wend

Ergebnis:

Laufzeitfehler '1004':

Die Methode 'Range' für das Objekt '_Global' ist fehlgeschlagen

Debuggen:

Range(Range("P" & i).Value & Range("Q" & i).Value) = ""

Diese Zeile wird markiert

0
Suboptimierer  27.09.2017, 22:11
@BlackMamba666

Hmm, bei mir geht es. Wahrscheinlich liegt es daran, dass irgendeine Zellkombination keinen gültigen Verweis ergibt. 

Hängt er dort schon beim ersten Durchlauf?

Du könntest der Übersichtlichkeit zugute die Argumente vor dem Aufruf in Variablen packen:

Sub optimierer()
    Dim i As Integer
    Dim sP As String
    Dim sQ As String
    i = 5
    'On Error Resume Next
    While Range("P" & i).Value <> "" And Range("Q" & i).Value <> ""
      sP = Range("P" & i).Value
      sQ = Range("Q" & i).Value
      Debug.Print i & ") : " & sP & sQ
      Range(sP & sQ) = "x"
    i = i + 1
    Wend
End Sub
0
Suboptimierer  27.09.2017, 22:18
@Suboptimierer

Du könntest dir sogar eine Funktion schreiben, die überprüft, ob eine als String übergebene Adresse gültig ist. Leider fällt mir auf die Schnelle keine Alternative dazu ein, eine Schutzverletzung abzufangen.

Sub optimierer()
    Dim i As Integer
    Dim sP As String
    Dim sQ As String
    i = 5
    'On Error Resume Next
    While Range("P" & i).Value <> "" And Range("Q" & i).Value <> ""
      sP = Range("P" & i).Value
      sQ = Range("Q" & i).Value
      If IsAddressValid(sP & sQ) Then
        Range(sP & sQ) = ""
      Else
        Debug.Print "Zeile " & i & ") Adresse " & sP & sQ & " ist ungültig."
      End If
    i = i + 1
    Wend
End Sub

Function IsAddressValid(sAdr As String) As Boolean IsAddressValid = False On Error GoTo Ende Dim r As Range: Set r = Range(sAdr) IsAddressValid = True Ende: End Function

Die Fehler kannst du dir auch in dein Sheet ausgeben oder in einer Messagebox. Wobei von einer Messagebox würde ich abraten, weil du nicht weißt, wie lang die Fehlerliste wird.

1
BlackMamba666 
Beitragsersteller
 28.09.2017, 09:02
@Suboptimierer

Hallo und guten morgen,

habe es nun so wie du es gepostet hast eingegeben:

Sub optimierer()
Meldung = "Achtung! Wollen sie ihre derzeitigen Angaben wirklich löschen?"
Titel = "Sicherheitsabfrage"
Stil = vbYesNo + vbCritical

Abfrage = MsgBox(Meldung, Stil, Titel)
If Abfrage = vbNo Then Exit Sub

Dim i As Integer
Dim sS As String
Dim sT As String
i = 5
'On Error Resume Next
While Range("S" & i).Value <> "" And Range("T" & i).Value <> ""
sS = Range("S" & i).Value
sT = Range("T" & i).Value
If IsAddressValid(sS & sT) Then
Range(sS & sT) = ""
Else
Debug.Print "Zeile " & i & ") Adresse " & sS & sT & " ist ungültig."
End If
i = i + 1
Wend
End Sub

Function IsAddressValid(sAdr As String) As Boolean
IsAddressValid = False
On Error GoTo Ende
Dim r As Range: Set r = Range(sAdr)
IsAddressValid = True
Ende:
End Function

Musste nur die Spalten ändern, da noch was im letzten Moment hinzugekommen ist.

Ergebnis: MISSION ACCOMPLISHED!! ;)

Zellen wurden ordnungsgemäß gelöscht ohne die Verbindungen zu kappen oder die Formatierungen zu ändern.

Jetzt aber wieder meine Frage zum verstehen (sofern du mir den Gefallen machst):

Ich splitte mal den Code und füge die Frage bzw. meine Vermutung bzw. Frage darunter:

    While Range("S" & i).Value <> "" And Range("T" & i).Value <> ""
sS = Range("S" & i).Value
sT = Range("T" & i).Value

Hier übergibst du die Werte an eine Variable

      If IsAddressValid(sS & sT) Then
Range(sS & sT) = ""

Hier die Funktion wenn Adresse gültig (laut Funktion <> False)

leere die spezifische Zelle

Else
Debug.Print "Zeile " & i & ") Adresse " & sS & sT & " ist ungültig."

zeig mir ansonsten den Fehler der gefunden wurde.

-> Jedoch geht er dann hier in den Debug-Modus und markiert die Zeile oder wie läuft das ab?

Function IsAddressValid(sAdr As String) As Boolean
IsAddressValid = False
On Error GoTo Ende
Dim r As Range: Set r = Range(sAdr)
IsAddressValid = True
Ende:
End Function

hier schreibst du eine Fariable als "Falsch"

-> klar weil du ja oben mit "If IsAddressValid (sS & sT) then" nach einem Wahrheitswert prüfst

nun zu deinem Letzten Post:

Die Fehler kannst du dir auch in dein Sheet ausgeben oder in einer
Messagebox. Wobei von einer Messagebox würde ich abraten, weil du nicht weißt, wie lang die Fehlerliste wird.

Wie mache ich das?

Noch eine letzte Frage:

sehe ich das richtig, dass ich diesen Code auch so verwenden kann um Fakedaten in diese Felder reinzuschreiben? Müsste nur dann den

Range(sS & sT) = ""

Bereich demendsprechend ändern. Oder?

Und nochmals Danke für die Gedult und Unterstützung! 10 Sterne von mir^^

0
Suboptimierer  28.09.2017, 10:16
@BlackMamba666

Danke für dein Kompliment!

-> Jedoch geht er dann hier in den Debug-Modus und markiert die Zeile oder wie läuft das ab?

Nein. Die Meldung wird im VBA-Editor ins Direktfenster geschrieben. I. d. R. wird das nur der Entwickler zu Gesicht bekommen. 
Wohin du deine Fehlermeldungen schreibst, bleibt dir überlassen. Du kannst auch theoretisch in eine Textdatei schreiben. Das erfordert zwar ein bisschen Arbeit, aber dann kannst du die Fehler einfach zählen und am Ende der Prozedur ausgeben: "Es sind 12 Fehler aufgetreten. Näheres hierzu wurde in die Datei "C:\a\b\c.log" geschrieben."

Man kann sich richtig daran austoben, etwas immer weiter zu verfeinern. Wichtig sollte für dich zunächst sein, dass es überhaupt läuft.

Range(sS & sT) = ""

Das funktioniert zwar, aber eigentlich habe ich mir angewöhnt, immer ".Value" dahinter zu setzen. Hier habe ich es vergessen.

Range(sS & sT).Value = ""

Ansatz für Schreiben in das Sheet mit dem Namen "Fehler" (kannst du für den Endanwender verstecken).

Zeile 1: Zeitpunkt Zeile Adresse Fehlertext

Dann schreibst du dir eine Funktion Log.

Sub Log(iZeile As Integer, sAdresse As String, sFehler As String)
  Dim ws As Worksheet
  Dim rNext As Range

Set ws = Sheets("Fehler") Set rNext = ws.Range("A" & ws.Rows.Count).End(xlUp).Offset(1, 0) rNext.Value = Now() rNext.Offset(0, 1).Value = iZeile rNext.Offset(0, 2).Value = sAdresse rNext.Offset(0, 3).Value = sFehler End Sub
0
BlackMamba666 
Beitragsersteller
 30.09.2017, 17:29
@Suboptimierer

OK danke dir.

Habe nun aber ein weiteres Problem.

Musste die intelligente Tabelle, wo er ja prüft wo sich die Felder tatsächlich befinden, in ein anderes Blatt verschieben.

Nun muss ich ja sagen, wo sich die Adressen der zu prüfenden Zellen befinden. Habe es mit Sheets versucht aber es klappt nicht.

Also die I-Tabelle befindet sich nun im Blatt "Erstellung" dort befindet sich auch logischerweise diese Spalte wo die Zieladressen berechnet werden.

jetzt soll er aber diese Koordinaten verwenden allerdings auf dem Blatt "Angaben"

folgendes versucht ohne Ergebnis (kein fehler, aber auch kein Ereignis)

    Dim i As Integer
Dim sS As String
Dim sT As String
i = 5
While Sheets("Erstellung").Range("X" & i).Value <> ""
sS = Sheets("Erstellung").Range("X" & i).Value
If IsAddressValid(sS) Then
Sheets("Angaben").Range(sS) = ""
Else
Debug.Print "Zeile " & i & ") Adresse " & sS & sT & " ist ungültig."
End If
i = i + 1
Wend
End Sub

Function IsAddressValid(sAdr As String) As Boolean
IsAddressValid = False
On Error GoTo Ende
Dim r As Range: Set r = Range(sAdr)
IsAddressValid = True
Ende:
End Function

Wie muss ich das ganze jetzt ändern?

0
Suboptimierer  03.10.2017, 11:38
@BlackMamba666

Du hast das aber ganz schön verändert. sS und sT sind überhaupt nicht mehr sprechend. Vielleicht wäre sC und sR für Column und Row besser.

sT gibst du aus, aber setzt du nirgendswo.

Wenn du auf ein anderes Blatt referenzierst, lautet der Syntax TabelleX!<Bereich>, zum Beispiel Tabelle1!A2:B2. In deinem Fall könntest du es mit "Angaben!" & sS versuchen. Besser wäre es noch, wenn du dir selbst das Tabellenblatt aus einer Zelle heraus lesen würdest.

Was du tun solltest? Ich würde bei IsAddressValid erstmal einen Parameter für das Tabellenblatt ergänzen. 

Deine Adressen zielst du dann mit Sheets(sTab).Range(sS) an oder mittels Range(sTab & "!" & sS).

0
BlackMamba666 
Beitragsersteller
 03.10.2017, 19:04
@Suboptimierer

Hi, ja ich habe es leider ändern müssen, da wieder einmal
der Chefe kam und Änderungen haben wollte.

- Es darf nur noch das Hauptblatt „Angaben“ sichtbar sein
alle anderen müssen versteckt werden.

- Im Blatt Angaben dürfen keine Berechnungen durchgeführt
werden

Jetzt stellt sich mir die Frage;

Funktioniert das ganze dann wenn sich die intelligente Tabelle
in einem anderen Blatt „Erstellung“ das auch noch versteckt sein muss, befindet?
Ich meine ich hätte mal gelesen, dass versteckte Blätter welche aber vom Script
benötigt werden zumindest kurz sichtbar gemacht werden müssen und ggf. danach
wieder auf versteckt gesetzt werden müssen.

Mit Syntax meinst du sicherlich dann so:

    Dim i As Integer
    Dim sS As String
    ‚Dim sT As String
    i = 5

    While Range("Erstellung!X" & i).Value <> ""
      sS = Range("Erstellung!X" & i).Value
      If IsAddressValid(sS) Then
        Range("Angaben!" & sS)= ""
     Else
        Debug.Print "Zeile " & i & ") Adresse " & sS & sT & " ist ungültig."
      End If
    i = i + 1
    Wend
End Sub

Function IsAddressValid(sAdr As String) As Boolean
    IsAddressValid = False
    On Error GoTo Ende
    Dim r As Range: Set r = Range(sAdr)
    IsAddressValid = True
Ende:
End Function

Mit deinen Aussagen:

Was du tun solltest? Ich würde bei IsAddressValid erstmal einen Parameter
für das Tabellenblatt ergänzen. 

Deine Adressen zielst du dann mit Sheets(sTab).Range(sS) an oder mittels
Range(sTab & "!" & sS).

Kann ich grad nichts anfangen. Wie meinst du das?

0
BlackMamba666 
Beitragsersteller
 03.10.2017, 19:33
@BlackMamba666

Vergessen zu sagen: der Code funktioniert aber nicht. Aber denkst du dir wahrscheinlich schon

0
BlackMamba666 
Beitragsersteller
 03.10.2017, 20:48
@BlackMamba666

ok hatte en schreibfehler drinn sry also funktioniert, aber was meintest du mit den 2 Aussagen?

0
Suboptimierer  03.10.2017, 23:22
@BlackMamba666

Du kannst die Sichtbarkeit mittels VBA beeinflussen, aber VBA kann auch auf unsichtbare Tabellenblätter zugreifen. Excel unterscheidet dabei zwischen "Hidden" und "Very Hidden", also "versteckt" und "sehr versteckt". Sehr versteckte Arbeitsblätter kann der Excel-Anwender sich nicht mehr einblenden.
___________

Du solltest auch in der Funktion IsAddressValid das Tabellenblatt einbeziehen und den Parameter hierfür ergänzen. 

Function IsAddressValid(sTab As String, sAdr As String) As Boolean

Du kannst auf ein anderes Tabellenblatt mittels 

Sheets(sTab).Range(sAdr)

oder

Range(sTab & "!" & sAdr) 

verweisen. Ich weiß nicht, wie ich das besser erklären soll.

Versuch selbst noch ein bisschen, mit VBA zu spielen. Wenn man etwas selber heraus findet, gibt es einen größeren Aha-Effekt, man ist stolz auf sich und man prägt es sich besser ein.

0