PDA

Vollständige Version anzeigen : Worksheet als Variable


Taipan1987
21.08.2017, 13:28
Hey hey ich hab durch euch eine Makro bekommen das auch soweit gut funktioniert und jetzt versuche ich dort das Worksheet als Variable anzugeben die sich je nach Eintrag im Excel ändert könnt ihr mir da behilflich sein ?

Option Explicit

Sub Kopieren_in_Tägliche()

Range("O19").Select
ActiveCell.FormulaR1C1 = "=R[-16]C[3]"
Range("O19").Select

Dim rng As Range

For Each rng In Selection
If IsNumeric(rng) Then
If rng >= 0 Then
rng = rng / 24
Else
rng = "-" & Format(Abs(rng) / 24, "hh:mm")
End If
End If
Next

Selection.NumberFormat = "[hh]:mm"

Dim fWerte As Variant, i As Long
Dim wbZiel As Workbook
Dim fWerte2 As Variant, i2 As Long
Dim Wsziel As Worksheet

Wsziel = ThisWorkbook.Worksheets("Tabelle1").Range("P54").Value
fWerte = ThisWorkbook.Worksheets("Tabelle1").Range("Q20:Q21").Value
fWerte2 = ThisWorkbook.Worksheets("Tabelle1").Range("P20:Q20").Value

Set wbZiel = Workbooks.Open(Filename:="D:Data11213065DesktopLFZAUSW KOPIE TESTTÄGLMEL 17.xlsx", ReadOnly:=False)

For i = LBound(fWerte, 1) To UBound(fWerte, 1)
If Not IsEmpty(fWerte(i, 1)) And IsAddress(fWerte(i, 1)) Then
ThisWorkbook.Worksheets("Tabelle1").Range("O20").Offset(i - 1, 0).Copy
wbZiel.Worksheets("Wsziel").Range(fWerte(i, 1)).PasteSpecial xlPasteValues
End If
Next i

For i2 = LBound(fWerte2, 1) To UBound(fWerte2, 1)
If Not IsEmpty(fWerte2(i2, 1)) And IsAddress(fWerte2(i2, 1)) Then
ThisWorkbook.Worksheets("Tabelle1").Range("N20").Offset(i2 - 1, 0).Copy
wbZiel.Worksheets("Wsziel").Range(fWerte2(i2, 1)).PasteSpecial xlPasteValues
End If
Next i2

Set wbZiel = Nothing
End Sub

Geht das überhaupt oder muss das fest sein? Ach und das rote Hab ich noch selbst versucht aber ich bin einfach nicht sehr bewandert.

Jonas0806
21.08.2017, 13:35
Hallo,

Du versuchst hier einer Worksheet-Variable einen String zuzuweisen. Das funktioniert so nicht, ausserdem müssen Objektvariablen "gesettet" werden.

strWszielName = ThisWorkbook.Worksheets("Tabelle1").Range("P54").Value
set Wsziel = ThisWorkbook.Worksheets(strWszielName)

Würde natürlich auch in einem Rutsch gehen.

Taipan1987
21.08.2017, 13:51
Also das kommt anstelle von Wsziel=... ?

Jonas0806
21.08.2017, 14:02
Hallo,

richtig. Und, einfach probieren ;)

Taipan1987
21.08.2017, 14:21
Hmm jetzt bin ich ein wenig verwirrt da haut er mir jetzt raus das die Variable nicht definiert ist.

Option Explicit

Sub Kopieren_in_Tägliche()

Range("O19").Select
ActiveCell.FormulaR1C1 = "=R[-16]C[3]"
Range("O19").Select

Dim rng As Range

For Each rng In Selection
If IsNumeric(rng) Then
If rng >= 0 Then
rng = rng / 24
Else
rng = "-" & Format(Abs(rng) / 24, "hh:mm")
End If
End If
Next

Selection.NumberFormat = "[hh]:mm"

Dim fWerte As Variant, i As Long
Dim wbZiel As Workbook
Dim fWerte2 As Variant, i2 As Long
Dim Wsziel As Long

strWszielName = ThisWorkbook.Worksheets("Tabelle1").Range("P54").Value
Set Wsziel = ThisWorkbook.Worksheets(strWszielName)

fWerte = ThisWorkbook.Worksheets("Tabelle1").Range("Q20:Q21").Value
fWerte2 = ThisWorkbook.Worksheets("Tabelle1").Range("P20:Q20").Value

Set wbZiel = Workbooks.Open(Filename:="D:Data11213065DesktopLFZAUSW KOPIE TESTTÄGLMEL 17.xlsx", ReadOnly:=False)

For i = LBound(fWerte, 1) To UBound(fWerte, 1)
If Not IsEmpty(fWerte(i, 1)) And IsAddress(fWerte(i, 1)) Then
ThisWorkbook.Worksheets("Tabelle1").Range("O20").Offset(i - 1, 0).Copy
wbZiel.Worksheets("Wsziel").Range(fWerte(i, 1)).PasteSpecial xlPasteValues
End If
Next i

For i2 = LBound(fWerte2, 1) To UBound(fWerte2, 1)
If Not IsEmpty(fWerte2(i2, 1)) And IsAddress(fWerte2(i2, 1)) Then
ThisWorkbook.Worksheets("Tabelle1").Range("N20").Offset(i2 - 1, 0).Copy
wbZiel.Worksheets("Wsziel").Range(fWerte2(i2, 1)).PasteSpecial xlPasteValues
End If
Next i2

Set wbZiel = Nothing
End Sub

Function IsAddress(ByRef vAddress As Variant) As Boolean
Dim cTemp As Range
On Error Resume Next
Set cTemp = ThisWorkbook.Worksheets(1).Range(vAddress)
IsAddress = Err = 0 And Not cTemp Is Nothing
Set cTemp = Nothing
End Function



Ist das so deiner Meinung nach richtig ?

Jonas0806
21.08.2017, 14:26
Hallo,

nunja, das liegt daran, dass Du (korrekterweise) Option Explicit verwendest. Das weißt dich darauf hin, dass die Variable strWszielName nicht definiert ist.

Ich denke, Du solltest dich vielleicht nochmal mit den Basics auseinandersetzten. Für den Moment, deklariere alle deine Variablen am Anfang des Codes, mit Angabe des korrekten Datentyps.

Wie kommst Du auf einemal auf den Dampfer, dein Sheet als Long zu deklarieren?

Für dein aktuelles Problem, deklariere die Variable.


Dim Wsziel As worksheet
dim strWszielName as string

strWszielName = ThisWorkbook.Worksheets("Tabelle1").Range("P54").Value
Set Wsziel = ThisWorkbook.Worksheets(strWszielName)

Taipan1987
21.08.2017, 14:32
Achso :D hatte ein bisschen hin und her versucht ^^ deswegen war es jetzt im Code ein String :D

Taipan1987
21.08.2017, 14:51
Hmm ich glaub ich brauch da mal nen Lehrgang. Jetzt markiert er mir den Absatz Set Wsziel = ThisWorkbook.Worksheets(strWszielName) und der Fehler ist '9' Index außerhalb des gültigen Bereichs.

Ich denke mal das es daher kommt das dieser Name als Worksheet nur in der Zieldatei vorhanden ist oder? Also geht da ThisWorkbook eigentlich gar nicht drin

Jonas0806
21.08.2017, 14:54
Hallo,
Hmm ich glaub ich brauch da mal nen Lehrgang.

Wie gesagt, das glaube ich auch. Im Netz gibt es viele Seiten, welche kostenlose Tutorials zur Verfügung stellen.

Silentwolf
21.08.2017, 18:19
Hallo Taipan1987,
ohne hier einen raushängen lassen zu wollen würde ich empfehlen folgendes mal zu verbessern.
Wenn Du userforms, commandbuttons und dergleichen in Deinen Code verwendest dann gewöhne Dir doch an diese Sinnvoll zu benennen.
Also ein commandbutton1 sagt einfach nicht viel aus. Ein cmdOK zum Beispiel schon und Du oder andere Hellfer könen viel besser Deinen Code verstehen auch wenn er mal ein paar Wochen nicht angeschaut wird.

Das selbe gilt für comboboxen listboxen und dergleichen. Es ist nur ein wenig mehr arbeit für Dich aber hilft wenn man einen Code später mal anschaut oder auch mal Fehler suchen und beheben möchte.
Zu Deiner Frage wenn Du ein Worksheet deklarieren möchtest dann sieht das so z.B.
Sub SetWorksheet()
Dim wksDaten As Worksheet

Set wksDaten = ThisWorkbook.Sheets("Tabelle1")

'hier wird das Worksheet das Du vorher gesettet hast aktiviert!
'Kann natürlich auch alles andere damit gemacht werden :-)

wksDaten.Activate


End Sub

Grundlagen Videos gibt es zum Beispiel von www.wiseowl.co.uk nur in English aber schon mal ein guter Einstieg. Auch sehr viele andere die es gut beschreiben und Dir sicher helfen einen Grundstock an VBA Wissen anzueignen gibt es auf YouTube .)

mfg
Silentwolf