Zum Inhalt springen

VBA - Zellen help


Angerf1st

Empfohlene Beiträge

Hallo,

ich komme dann ma direkt zu meinem problem.

ich schreibe gerade ein Programm in das man Excel Dateien Importieren kann

(In eine Excel Datei)

und in der bestimmte Sachen vergliechen werden und dann berechnet.

Das ganze Programm ist nicht sonderlich "Variabel" vorallem muss der Benutzer

immer eingeben wie viele Zeilen es sind sonst vergleicht das Programm erst garnicht.

Meine Frage

Wie kann ich es anstellen das Excel sagen wir mal in Spalte B

alle Zeilen zählt (nach unten) bis kein Wert mehr in der zelle steht

Er zählt mir praktisch alle zeilen bis zu der Zelle in der kein wert mehr steht

dadurch müsste das nicht immer angegeben werden.

Durch google bin ich auf die Lösung gekommen

"Sheets("Tabelle1").Range(Cells(ZelleA, 2), Cells(ZelleB, 2)).Select" da bekomm ich aber immer einen fehlerlaufzeit fehler

(ich habe es auch schon mit einer einfachen for schleife probiert dort bekomm ich aber immer den fehler es wäre kein next vorhanden :confused:) kenn ich aus c++ garnicht

Danke schonmal im vorraus

(rechtschreibfehler sind genug vorhanden ;P)

Link zu diesem Kommentar
Auf anderen Seiten teilen

hi,

das kannst du z.B. so hier machen:

Public Function zellenZaehlen()

Dim zaehler As Integer


     zaehler = 0

     Do While ActiveCell <> ""

          zaehler = zaehler + 1

          ActiveCell.Offset(1, 0).Select

     Loop


End Function

mfg

das ganze zählt mir doch alle zellen oder?

wollt eig nur die kompletten zeilen runterzählen in zB Spalte D

Link zu diesem Kommentar
Auf anderen Seiten teilen

Guten Morgen,

ich nutze folgende Zeilen:


Range("E1").Select
// Spalte in der gezählt werden soll
Range(Selection, Selection.End(xlShiftDown)).Select
// Markiert alles bis ein Leeres Feld kommt.
zeilen = Selection.Rows.Count
// Speichert die Anzahl der Zeilen in einer anderen Variable ab.
[/PHP]

Vorher hatte ich es auch mit Schleife realisiert, so geht es aber schneller :D

[b]Hinweis #1[/b]: Das geht aber nur wenn Du weißt - so wie bei mir - das ein

bestimmtes Feld immer gefüllt ist. Sollte das nicht der Fall sein wird nicht

alles markiert, somit nicht gezählt.

[b]Hinweis #2[/b]: Im Code-Abschnitt oben haben ich ' (Zeilenkommentar Excel)

mit // (Zeilenkommentar PHP) ersetzt damit es aussieht wie ein Kommentar.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi danke ich hab das jetz ma so gemacht...

Sheets("Tabelle1").Select

counter1 = ActiveSheet.Cells(65536, 4).End(xlUp).Row

Sheets("Projektelemente").Select

counter2 = ActiveSheet.Cells(65536, 2).End(xlUp).Row

naja is halt auch nicht variabel gehalten aber war die einfachste lösung für so ein "anfänger wie mich" zumindest in vba :D

--------------------------------------------------------------------------

Mittlerweile hab ich acuh neues Problem:

Fehlermeldung 1004. LAufzeitfehler

While counter2 > 0

'Fügt die beiden Projekt ID's aus dem Sheet "Projekelemente" zusammen

'damit man sie vergleichen kann

zahl2 = ActiveWorkbook.Worksheets("Projektelemente").Cells(ZeilenB, 2)

zahl3 = ActiveWorkbook.Worksheets("Projektelemente").Cells(ZeilenC, 3)

Speicher(1) = zahl2

Speicher(2) = zahl3

Zahlenkette = Join(Speicher)

'löscht die leerzeichen in "Tabell1"

'und speichert die Zahlenkette in zahl1

zahl1 = ActiveWorkbook.Worksheets("Tabelle1").Cells(ZeilenD, 4)

zahl1 = DelSpaces(zahl1)

'Projekt ID's auf Gleichheit prüfen

If Zahlenkette <> zahl1 Then

ZeilenD = ZeilenD + 1

End If

If Zahlenkette = zahl1 Then

ZeilenD = 2

ZeilenB = ZeilenB + 1

ZeilenC = ZeilenC + 1

counter2 = counter2 - 1

End If

Wend

MsgBox "Schleife ist durchgelaufen"

die schleife läuft nciht druch kann einer den fehler erkennen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

bitte Code-Zeilen immer mit [_PHP][/php_] (ohne _) einfügen dann kann man den Code besser lesen.

Welche Zeile wird denn markiert?

[Edit1: Lösung?]

Vermutlich liegt das Problem hier:


zahl1 = ActiveWorkbook.Worksheets("Tabelle1").Cells(Zeilen D, 4)
[/PHP]

müsste es nicht

[PHP]
zahl1 = ActiveWorkbook.Worksheets("Tabelle1").Cells(ZeilenD, 4)

heissen?

Bearbeitet von Maulwurf_der_Schlaue
wegen Lösungsvorschlag um Doppeltpost zu vermeiden
Link zu diesem Kommentar
Auf anderen Seiten teilen

Achso ne, das habe ich gefixt das ist durchs kopieren gekommen leider :(.

Kann es auch daran liegen (was ich erst jetzt gemerkt habe)

das er durchläuft und kein wert findet....]

bekomm aber trotzdem noch den fehler Laufzeitfehler 1004

also ich bin die logik dahinter durch gegangen und ich kann mir einfach nicht erklären warum er nicht in das else springt außer er findet den wert nicht...

warum er dann allerdings weitermacht keine ahnung....zahl1 ist auch nicht NULL also kann da auch kein fehler sein *verzweifel*

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

geh doch den Abschnitt mit dem Debugger Schritt für Schritt durch, und

schau bei welcher Zeile er aussteigt, oder kommt die Meldung gleich zu

beginn?

Poste bitte nochmal den aktuellen Code, Danke.

Edit:

Ich nehme an ZeilenB/ZeilenC werden initialisiert?


If Zahlenkette <> zahl1 Then
ZeilenD = ZeilenD + 1
End If

If Zahlenkette = zahl1 Then
ZeilenD = 2
ZeilenB = ZeilenB + 1
ZeilenC = ZeilenC + 1
counter2 = counter2 - 1
End If
[/PHP]

Wieso zählst Du ZeilenD um ein Hoch, wenn Du es später ohnehin wieder auf 2 festlegst?

Bearbeitet von Maulwurf_der_Schlaue
Link zu diesem Kommentar
Auf anderen Seiten teilen

Private Sub CommandButton1_Click()
Dim Tabelle1kette As String
Dim zahl1 As String
Dim zahl2 As String
Dim zahl3 As String
Dim Speicher(1 To 2) As String
Dim Zahlenkette As String



'Variable "Tabelle1"
Dim ZeilenD As Long
ZeilenD = 2
Dim counter1 As Long
'Variablen "Projektelmente"
Dim ZeilenB As Long
Dim ZeilenC As Long
ZeilenB = 2
ZeilenC = 2
Dim counter2 As Long


'Deklaration der Counter (wichtig für die Schleifen)
'Counter 1 zählt die Zeilen im sheet "Tabelle1"
'Counter 2 zahlt die Zeilen im sheet "Projektelemente"
Sheets("Tabelle1").Select
counter1 = ActiveSheet.Cells(65536, 4).End(xlUp).Row
Sheets("Projektelemente").Select
counter2 = ActiveSheet.Cells(65536, 2).End(xlUp).Row


MsgBox counter1
While counter2 > 0
'Fügt die beiden Projekt ID's aus dem Sheet "Projekelemente" zusammen
'damit man sie vergleichen kann
zahl2 = ActiveWorkbook.Worksheets("Projektelemente").Cells(ZeilenB, 2)
zahl3 = ActiveWorkbook.Worksheets("Projektelemente").Cells(ZeilenC, 3)
Speicher(1) = zahl2
Speicher(2) = zahl3
Zahlenkette = Join(Speicher)

'löscht die leerzeichen in "Tabell1"
'und speichert die Zahlenkette in zahl1
zahl1 = ActiveWorkbook.Worksheets("Tabelle1").Cells(ZeilenD, 4)
zahl1 = DelSpaces(zahl1)

'Projekt ID's auf Gleichheit prüfen
If Zahlenkette <> zahl1 Then
ZeilenD = ZeilenD + 1
If counter2 = 0 Then
counter2 = counter1
End If
Else
ZeilenD = 2
ZeilenB = ZeilenB + 1
ZeilenC = ZeilenC + 1
counter2 = counter2 - 1
End If
Wend
MsgBox "Schleife ist durchgelaufen"[/PHP]

er soll ja dann in dem anderen sheet zeileB und zeileC den 2 wert nehmen und in tabell1 komplett suchen wo er steht dazu muss er ja wieder von vorne anfangen

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

wenn Du einen Wert in einem Bereich suchst verwende FIND siehe Hilfe (F1 wenn das Wort in Excel markiert ist).

So wie es aussieht findet er bei Dir keine Übereinstimmung und läuft

dann über die 65536-Zeilengrenze. Ich hab das Skript mit leeren

Arbeitsblättern gestartet. Da ich das Skript starten konnte geh ich davon aus

das das


'Deklaration der Counter (wichtig für die Schleifen)
'Counter 1 zählt die Zeilen im sheet "Tabelle1"
'Counter 2 zahlt die Zeilen im sheet "Projektelemente"
Sheets("Tabelle1").Select
counter1 = ActiveSheet.Cells(65536, 4).End(xlUp).Row
Sheets("Projektelemente").Select
counter2 = ActiveSheet.Cells(65536, 2).End(xlUp).Row
[/PHP]

nicht richtig funktioniert.

Ich muss mich entschuldigen, Du solltest mal um den Counter1 und Counter2

zu ermitteln die For-Schleifen-Version anwenden, ich bin mir im Moment nicht

sicher warum meine Version zum ermitteln nicht funktioniert.

(Werde mir das nochmal genau ansehen)

Dann füge noch folgendes ein und zwar vor dem Wend

[PHP]
If ZeilenD >= 65536 Or _
ZeilenC >= 65536 Or _
ZeilenB >= 65536 Then
MsgBox "Keine Uebereinstimmung fuer '" & zeichenkette & "' gefunden!", vbOKOnly
counter2 = 0
End If

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also sobald ich dein Code einfüge( vielen vielen Dank übrigends dafür =) )

ohne was bei mir jetz speziel geändert zu haben komm

"Keine übereinstimmung.......etc"

also wird es wohl darin liegen das er keine übereinstimmung hat..

(warum auch immer das projekt in der tabelle noch nicht drin ist :upps)

oder seh ich das falsch und es könnte noch an etwas anderem liegen..

ich glaube unteranderem auch das ich die counter falsch mache obwohl ich eigentlich ja auch nur den counter1 brauchen fällt mir gerade ma so auf(ich idiot). Lass ich mir diesen aber ausgeben kommt er auf die richtige Zeilenwerte was mich dann weider zweifeln lässt ob es nun auch an dem counter liegt oder einfach weil er keinen wert findet

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

hab mir das ganze nochmal angesehen und versucht Dir zu zeigen

was du brauchst:

Folgende Variablen:

- eine zum Speichern wie viele Zeilen auf Tabelle1 in Spalte D mit Werten gefüllt sind

- eine zum Speichern wie viele Zeilen auf Projektelemente in Spalte B/C mit Werten gefüllt sind

- eine zählvariable (for-schleife)

- eine Range-Variable zum speichern von Zellbezügen (find)

- eine Variable mit dem Suchkriterium (Spalte B & Spalte C aus Projektelemente)

Ablauf:

- ermitteln gefüllte zeilen in spalte D in Tabelle1

- ermitteln gefüllte zeilen in spalte B/C in Projektelemente

- for schleife (durchlaufe alle zeilen in Projektelemente Spalte B)

- Suchwort ermitteln

- Suchbereich definieren mit Range().select

- Suche starten


Set gefunden = Selection.Find(What:=Zahlenkette, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
[/php]

- Suche auswerten, wenn gefunden ist "is nothing" heisst kein Treffer

Wenn es noch Fragen dazu gibt dann sag einfach Bescheid.

P.S.

Ich könnte jetzt auch mein Excel-Dokument hochladen, dann wäre aber der

Lerneffekt gleich null :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi ich werde es gleich ma testen.

Ich hatte übers Wochende kein Internet da ich meine eltern besuchen war.

Mfg

//Edit also klappen tut das ganze bei mir nur wenn er beim ersten nichts findet

er nimmt aber aus dem sheet "Projektelemente"(dort wo SpalteB und C zusammgengefügt werden)

nur Zeile3 findet er mit der ID nichts bricht er komplett ab dabei soll er dann zu Zeile4 gehen und mit der ID weiter suchen :'( *verzweifel*

Link zu diesem Kommentar
Auf anderen Seiten teilen

/edit2 (kann meine einträge nicht bearbeiten -.-)

Nach dem test hab ich den fehler und zwar

zählt er obwohl in "Tabelle1" keine zellen mehr eingetragen sind bis 65xxx anstatt

sich im Sheet "Projeklemente" die neue zahl zu holen und wieder von vorne mit suchen beginnen...hab mich auch gewundert warum er IMMER in der if schleife gelandet ist in der die ausgabe ist "Keine trallala gefunden"....

mit deinem letzen code kann ich allerdings nichts anfangen da ic davon nur bahnhof verstehe :upps

trotzedm vielen dank für alles schonmal :uli

Link zu diesem Kommentar
Auf anderen Seiten teilen

Guten Morgen,

also so ermittle Ich die Counter


// Ermitteln wie viele Werte auf Tabelle 1 maximal vorhanden sind
Sheets("Tabelle1").Select
ActiveSheet.Range("D1").Select
ActiveSheet.Range("D1", Selection.End(xlDown)).Select
Tabelle1Zeilen = Selection.Rows.Count

// Ermitteln wie viele Einträge auf Tabelle1 gesucht werden sollen
Sheets("Projektelemente").Select
ActiveSheet.Range("B1").Select
ActiveSheet.Range("B1", Selection.End(xlDown)).Select
ProjektZeilen = Selection.Rows.Count
[/PHP]

und so suche ich den Wert von Projektelemente in Tabelle1

[PHP]
Range("D1" & ":D" & Tabelle1Zeilen).Select

// Suchen nach der Zahlenkette in dem selektierten Bereich
Set gefunden = Selection.Find(What:=Zahlenkette, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)

// Wurde kein Treffer gefunden ist die Variable gefunden = nothing
If gefunden Is Nothing Then
// Hier eventuell anpassen, bei mir schreibt er halt in Zeile D das
// in Tabelle1 das Projektelement nicht gefunden wurde.
ActiveWorkbook.Worksheets("Projektelemente").Range("D" & Zeile) = "kein Treffer"
Else
// Hier eventuell anpassen, bei mir schreibt er halt in Zeile D wo er das
// entsprechende Projektelement in Tabelle1 gefunden hat.
ActiveWorkbook.Worksheets("Projektelemente").Range("D" & Zeile) = "gefunden in Zelle " & gefunden.Address
End If

Bitte beim Einfügen in Excel beachten die // druch ' zu ersetzen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...