Datei per Dialog verschieben funktioniert nicht richtig

  • Excel

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von enivanfamilia.

    Datei per Dialog verschieben funktioniert nicht richtig

    Neu

    ausgelagert aus FolderPickerPfad über Dialog auswählen (FileDialog(msoFileDialogFolderPicker)) ~VaporiZed

    Hallo,

    ist etwas älter hier, aber nach dem google mich hier her geführt hat fand ich das genau was ich gesucht habe.
    Habe mich dann daran versucht, den Code bei mir zu integrieren und funktioniert auch soweit ohne Fehlemeldung, nur:

    Egal welchen Ordner ich aus auswähle, die Datei landet einfach nicht dort. Sondern Immer wo die Originaldatei liegt, was ich dann eigentlich nicht brauche.

    Falls mir einer den Fehler sagen kann bitte! Ich finde ihn einfach nicht.


    [

    Visual Basic-Quellcode

    1. Public Function GetExcelfolder() As String
    2. With Application.FileDialog(msoFileDialogFolderPicker)
    3. .AllowMultiSelect = False
    4. .Title = "Bitte Ordner wählen"
    5. .InitialFileName = ""
    6. .InitialView = msoFileDialogViewThumbnail
    7. .ButtonName = "OK"
    8. If .Show = -1 Then
    9. GetExcelfolder = .SelectedItems(1)
    10. End If
    11. End With
    12. End Function


    Visual Basic-Quellcode

    1. Option Explicit
    2. Sub rezept_save()
    3. Dim MyPath As String
    4. Dim wb As Workbook
    5. Dim bolExist As Boolean
    6. Call GetExcelfolder
    7. 'Prüfung der Sorte
    8. If Range("C6").Value = "" Then
    9. MsgBox ("Sortenname eingeben!")
    10. Else
    11. 'prüft ob schon vorhanden
    12. For Each wb In Workbooks
    13. If Left(wb.Name, Len(wb.Name) - 1) = Range("C6").Value Then
    14. bolExist = True
    15. Exit For
    16. End If
    17. Next wb
    18. If Not bolExist Then
    19. Sheets("Druckansicht").Copy
    20. ActiveWorkbook.SaveAs (Range("C6").Value)
    21. Else
    22. With Workbooks(Range("C6").Value & ".xlsx")
    23. ThisWorkbook.Sheets("Druckansicht").Copy After:=.Worksheets(.Worksheets.Count)
    24. End With
    25. End If
    26. With ActiveSheet
    27. .Cells.Copy
    28. .Range("A1").PasteSpecial Paste:=xlValues
    29. On Error Resume Next
    30. .Name = .Range("J1").Value
    31. End With
    32. Application.CutCopyMode = False
    33. End If
    34. End Sub

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    Neu

    Ich versteh's grad nicht. Du rufst GetExcelfolder in Codeblock#2, Zeile#9 auf, bekommst von der Prozedur was zurück, aber Du verarbeitest es nicht. GetExcelfolder gibt Dir n Verzeichnis als String zurück. Irgendwo in Deinem restlichen Code musst Du diesen String aber auch dazu nutzen, um das zu machen, was Du vorhast. Woher soll Dein Programm sonst wissen, was es mit dem String/Verzeichnisnamen anfangen soll?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Neu

    Ja das hab ich tatsächlich schon probiert, wieder aus gebaut wegen fehlermeldung und vergessen. Meine Kenntnisse sind leider 20 Jahre eingerostet...

    Ich hatte myPath = getExcelfolder gesetzt und dann bei SaveAs mit eingebaut, was wohl irgendwie falsch war. Ich hab Probleme wieder rein zu kommen in VB und die Syntax kenn ich quasi garnicht mehr.

    Kann mir einer da ein wenig Nachhilfe bzw. Schubs in die richtige Richtung geben?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „enivanfamilia“ ()

    Neu

    Ok, mit GetFolderPath bekommst Du ein Verzeichnis als String. Den musst Du aber noch mit einem Dateinamen kombinieren, sonst klappt das mit dem SaveAs nicht. Wenn in Range("C6").Value der Dateiname steht, dann also wohl

    Visual Basic-Quellcode

    1. '...
    2. MyPath = GetExcelfolder
    3. '...
    4. ActiveWorkbook.SaveAs MyPath & "\" & Range("C6").Value 'ggf. auf Doppelslash prüfen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Neu

    Da hätte ich ja noch ewig suchen können :D Hätte nie erwartet, den Pfad beim vergeben des NAMENS mit ein zubinden, da beim anzeigen der Syntax ja die Eigenschaften gezeigt werden (Filename,format, password...blabla) und da nix von pfad steht.
    Und ja, das Problem mit dem Doppelslash kommt eigentlich nur wenn ich auf ein Laufwerk bei der Ordnerwahl nehme, wie z.B. "D:\"

    a) Kein plan wie man das "abfängt" und
    b) was ich eben bemerkt habe, sollte man bei der Function keinen Ordner wählen sondern ABBRECHEN, ist ja die Variable LEER ( ="" ), was wiederum zu einem Laufzeilenfehler führt.

    Ich hab schon immer probleme damit gehabt, Fehler ab zu fangen bzw. weiss nicht womit, mir kommt da immer nur IF in den Kopf... :(

    Aber ich bin schon viel weiter als ich dachte, Danke!

    Neu

    Naja, FileName ist beim Speichern und Laden selten nur der Dateiname an sich, sondern meist der komplette Pfad, also inklusive Verzeichnis.

    enivanfamilia schrieb:

    mir kommt da immer nur IF in den Kopf
    Na passt doch ganz gut rein. Versuch mal an passenden Stellen das hier einzubauen:

    Visual Basic-Quellcode

    1. If myPath = "" Then Exit Sub

    Visual Basic-Quellcode

    1. Dim CompletePath As String
    2. CompletePath = MyPath
    3. If Right(myPath, 1) <> "\" Then CompletePath = CompletePath & "\"
    4. CompletePath = CompletePath & Range("C6").Value
    5. ActiveWorkbook.SaveAs CompletePath
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Neu

    Habe es wohl hinbekommen. Funktioniert einwandfrei, wenn man die Befehle kennt und weiß wann man sie wo gebrauchen kann :)

    right war mir z.b. nicht bekannt. Aber mir ist klar geworden, dass man damit von rechts aus prüft ob ein "\" da ist.
    Ähnelt dem "um-die-Ecke-denken" bei Excel, wenn man mit Zeilen und Spaltenzahlen komplexere, dynamische Tabellen baut.

    Mein letztes "?" ist allerdings noch offen, wenn du da auch noch ein Tipp hast?
    Wenn das Makro fertig ist, bleibt die neu erstellte Datei mit dem kopierten Inhalt offen. Will ich sie aber per thisworkbook.close schließen, nimmt er stattdessen das "original" und schließt es,
    obwohl eigentlich am Ende vom Code mit With ActiveSheet die neue Datei im Fokus sein müsste?!

    Ebenfalls, wenn ich manuell das neue schließe, fragt er nochmals "Speichern?" (Hier denk ich, ist es aber eine Exceleinstellung...).

    EDIT: Ah ich glaube es liegt daran das mein Makro ja in der ORIGNIAL-Datei ist, und deshalb thisworkbook jenes wählt...richtig? Dann habe ich das Problem, dass ich nicht weiß wie ich das andere "wähle"...

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „enivanfamilia“ ()

    Neu

    Wenn das zu schließende Workbook gerade aktiv ist, kannst du ActiveWorkbook.Close verwenden.
    Das ist aber alles ein heißes Eisen.
    Du verlässt dich da auf Dinge, die das Programm nicht mehr in der Hand hat.
    Wenn der User mit der Maus irgendwo klickt, während das Macro läuft, kann sich das alles plötzlich in Chaos verwandeln.

    Normalerweise hinterlegt man das Workbook beim Öffnen in einer Variablen und verwendet diese zum schließen.

    Visual Basic-Quellcode

    1. Set wb = Workbooks.Open(...)
    2. ' do whatever
    3. wb.Close
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Neu

    Ein neues Problem ist aufgetaucht und ich weiß nicht wie es behebbar ist... Lacht mich nicht wegen dem Code aus, ich wusste mir im Moment nicht besser zu helfen und es macht auch das was es soll!

    Jedoch, kommt während das Programm durchläuft 2x! erneut eine abfrage um DATEN zu aktualisieren (wo ich erneut eine Datei wählen muss bzw. die Quelldatei).
    Das für mich daran unverständliche ist:

    Visual Basic-Quellcode

    1. With ActiveSheet
    2. .Cells.Copy
    3. .Range("A1").PasteSpecial Paste:=xlValues
    4. On Error Resume Next
    5. 'Eintragsmenge
    6. FormelINPUT = "WENN(SUMME($G$4:$G$8)=0;"""";SUMME($G$4:$G$8))"
    7. Range("G9").FormulaLocal = FormelINPUT
    8. 'Pulperanzahl
    9. FormelPulp = "=WENNFEHLER(WENN($G$1/$G$9="""";"""";WENN($G$1/$G$9-ANZAHL2($B$16:$B$30)<0;0;$G$1/$G$9-ANZAHL2($B$16:$B$30)));"""")"
    10. .Range("R6").FormulaLocal = FormelPulp
    11. 'Eingetragene Menge
    12. FormelMass = "=WENNFEHLER(WENN(SUMME($B$16:$F$30)=0;"""";SUMME($B$16:$F$30));"""")"
    13. .Range("R8").FormulaLocal = FormelMass
    14. 'Rückwasser an PM Ja
    15. FormelPM = "=WENN(EINGABE!$C$18="""";FALSCH;WENN(EINGABE!$C$18=""Ja"";WAHR;FALSCH))"
    16. .Range("W3").FormulaLocal = FormelPM
    17. 'Rückwasser an PM Nein
    18. FormelPM2 = "=WENN($W$3=WAHR;FALSCH;WAHR)"
    19. .Range("W4").FormulaLocal = FormelPM2
    20. 'Dickstoff in Bütte
    21. FormelDick = "=WENN(EINGABE!$C$19="""";"""";WENN(EINGABE!$C$19=""Ja"";WAHR;FALSCH))"
    22. .Range("W7").FormulaLocal = FormelDick
    23. 'Dickstoff in Gitterbox
    24. FormelDick2 = "=WENN($W$7=WAHR;FALSCH;WAHR)"
    25. .Range("W8").FormulaLocal = FormelDick2


    Ich habe 9 spezifische Formeln, die in wiederum feste Zellen hinterlegt werden müssen, NACHDEM alle vorherigen "Formeln & verlinkungen" in WERTE verwandelt und in die neue Datei gelegt wurden.
    Also:
    a) Woran liegt das? (zwischenspeicher voll?)
    b) Kann man das mit For-next oder for-each oder ähnlichem vereinfachen/lösen OHNE für jede formel eine Variable anzulegen?
    c) bin ich zu doof/alt zum programmieren :O

    OK gefunden. Die Formeln verlinken auf ein vorher nicht benutztes Tabellenblatt. gibt sicher ein möglichkeit die VORHER in Variablen zu speichern....aber ich bekomme es nicht hin ;(

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „enivanfamilia“ ()

    Neu

    Hallo enivanfamilia,
    mir ist aufgefallen, das fast alle deine geschilderten Probleme damit zusammen hängen, dass du und Excel verschiedene Meinungen habt, was denn nun die gerade aktive Zelle, Arbeitsblatt, Datei, Ordner, etc. sind. Dies liegt daran, dass du immer Verweise benutzt wie ActiveWorkbook, ActiveSheet, ThisWorkbook, etc. Warum sagst du Excel nicht explicit, wo genau es etwas tun soll ? Hierzu ein kleines Beispiel für die Auswahl einer Tabelle:

    Quellcode

    1. Sub test_1()
    2. Dim T1 As Worksheet
    3. Set T1 = Worksheets(1)
    4. 'Zelle A1 in der Tabelle1 wird der Wert 123 zugewiesen.
    5. T1.Cells(1, 1).Value = 123
    6. Dim T2 As Worksheet
    7. Set T2 = Worksheets(2)
    8. T2.Cells(2, 1).Value = "Ich bin Zelle A2 in Tabelle2"
    9. End Sub


    Gruß,
    Zorroot

    Neu

    enivanfamilia schrieb:

    Jedoch, kommt [...] 2x! erneut eine abfrage um DATEN zu aktualisieren
    Welche Prozedur ist das? rezept_save? Dann wirst Du wohl auch entsprechend oft die Prozeduren GetExcelfolder oder rezept_save aurufen. Da der gezeigte Code unvollständig ist (es ist z.B. nicht klar, an welcher Stelle und wodurch überhaupt rezept_save aufgerufen wird), wird es schwierig, da den Fehler zu finden.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Neu

    Visual Basic-Quellcode

    1. Option Explicit
    2. Sub rezept_save()
    3. Dim MyPath As String
    4. Dim wb As Workbook
    5. Dim bolExist As Boolean
    6. Dim CompletePath As String
    7. Dim Formelinput As String, FormelPulp As String, FormelMass As String, FormelPM As String, FormelPM2 As String, FormelDick As String, FormelDick2 As String
    8. 'Dickstoff in Bütte
    9. FormelDick = "=WENN(EINGABE!$C$19="""";"""";WENN(EINGABE!$C$19=""Ja"";WAHR;FALSCH))"
    10. 'Rückwasser an PM Ja
    11. FormelPM = "=WENN(EINGABE!$C$18="""";FALSCH;WENN(EINGABE!$C$18=""Ja"";WAHR;FALSCH))"
    12. 'Eintragsmenge
    13. Formelinput = "=WENN(SUMME($G$4:$G$8)=0;"""";SUMME($G$4:$G$8))"
    14. 'Pulperanzahl
    15. FormelPulp = "=WENNFEHLER(WENN($G$1/$G$9="""";"""";WENN($G$1/$G$9-ANZAHL2($B$16:$B$30)<0;0;$G$1/$G$9-ANZAHL2($B$16:$B$30)));"""")"
    16. 'Eingetragene Menge
    17. FormelMass = "=WENNFEHLER(WENN(SUMME($B$16:$F$30)=0;"""";SUMME($B$16:$F$30));"""")"
    18. 'Rückwasser an PM Nein
    19. FormelPM2 = "=WENN($W$3=WAHR;FALSCH;WAHR)"
    20. 'Dickstoff in Gitterbox
    21. FormelDick2 = "=WENN($W$7=WAHR;FALSCH;WAHR)"
    22. 'Prüfung der Sorte
    23. If Range("C6").Value = "" Then
    24. MsgBox ("Sortenname eingeben!")
    25. Exit Sub
    26. Else
    27. MyPath = GetExcelfolder
    28. If MyPath = "" Then Exit Sub
    29. CompletePath = MyPath
    30. 'prüft ob schon vorhanden
    31. For Each wb In Workbooks
    32. If Left(wb.Name, Len(wb.Name) - 1) = Range("C6").Value Then
    33. bolExist = True
    34. Exit For
    35. End If
    36. Next wb
    37. If Not bolExist Then
    38. If Right(MyPath, 1) <> "\" Then CompletePath = CompletePath & "\"
    39. CompletePath = CompletePath & "KW_" & Range("I8").Value & "_" & Range("C6").Value
    40. Sheets("Druckansicht").Copy
    41. ActiveWorkbook.SaveAs CompletePath
    42. Else
    43. With Workbooks(Range("C6").Value & ".xlsx")
    44. ThisWorkbook.Sheets("Druckansicht").Copy After:=.Worksheets(.Worksheets.Count)
    45. End With
    46. End If
    47. With ActiveSheet
    48. .Cells.Copy
    49. .Range("A1").PasteSpecial Paste:=xlValues
    50. On Error Resume Next
    51. .Range("G9").FormulaLocal = Formelinput
    52. .Range("R6").FormulaLocal = FormelPulp
    53. .Range("R8").FormulaLocal = FormelMass
    54. .Range("W3").FormulaLocal = FormelPM
    55. .Range("W4").FormulaLocal = FormelPM2
    56. .Range("W7").FormulaLocal = FormelDick
    57. .Range("W8").FormulaLocal = FormelDick2
    58. .Name = .Range("J1").Value
    59. .Range("A1").Select
    60. End With
    61. Application.CutCopyMode = False
    62. End If
    63. Me.Activate
    64. Call clear_all
    65. End Sub
    66. Sub clear_all()
    67. If MsgBox("Neuen Eintrag anlegen?", vbYesNoCancel) = vbYes Then
    68. Range("C4:C7").Value = ""
    69. Range("C13:C14").Value = ""
    70. Range("C19:C21").Value = ""
    71. Range("C24:C30").Value = ""
    72. Range("E4:F8").Value = ""
    73. Range("F11:F13").Value = ""
    74. Range("E4:E8").Value = ""
    75. Range("E17").Value = ""
    76. Else
    77. End If
    78. End Sub


    Es ist ansich kein Fehler, jedoch ziemlich nervig das zweimal das ordner fenster kommt und man eine Datei wählen soll(habe gemerkt, ist sogar egal welche).
    nach einzelschritten kamen die abfragen jedesmal wenn es um das einfügen von den zwei einzelnen Formeln geht, welche auf ein anderes blatt als das ursprüngliche verweisen...

    Vielleicht hilft die Datei Erstellung.xlsm

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „enivanfamilia“ ()

    Neu

    Hi Zoroot,
    dein post habe ich glatt übersehen.

    zorroot schrieb:

    Hallo enivanfamilia,
    mir ist aufgefallen, das fast alle deine geschilderten Probleme damit zusammen hängen, dass du und Excel verschiedene Meinungen habt, was denn nun die gerade aktive Zelle, Arbeitsblatt, Datei, Ordner, etc. sind. Dies liegt daran, dass du immer Verweise benutzt wie ActiveWorkbook, ActiveSheet, ThisWorkbook, etc. Warum sagst du Excel nicht explicit, wo genau es etwas tun soll ? Hierzu ein kleines Beispiel für die Auswahl einer Tabelle:
    [...]
    Gruß,
    Zorroot

    Das Hauptproblem ist, wie du schon erkannt hast, das ich nicht viel behalten habe, als ich vor 20Jahren das mal "gelernt" habe :P Auch damals hatte ich ein wenig Probleme zu verstehen, wann man was, wo, wie am besten nutzt und wie das am Ende eigentlich verarbeitet wird. Das was ich hier versuche zu machen ist auch nur weil es mich interessiert und bei mir auf arbeit keiner auch nur ein Plan vom arbeiten mit PC hat. Die schreiben lieber auf Zettel -.- Aber ich schweife ab...

    Den bisherigen Code habe ich halt nicht komplett selbst geschrieben. Lediglich google gefragt, und altes gefundenes probiert, ob es für meine Zwecke nützlich ist. Dann nur noch angepasst bis es ging wie ich es hoffte.
    Soweit sogut. Aber den code verstehen und die ganzen eigenschaften und befehle(was es halt so alles gibt) ist noch eine große Lücke.

    zB bei deinem tipp: Ich denke halt, ich kann doch nur explizite Werte in Zellen geben, wenn diese nicht verändert werden dürfen.

    Vielleicht hilft es, wenn ich den ganzen PLAN, was eigentlich die Idee hinter der Sacheist, einmal schildere? Ich will hier nur nicht Leuten zur Last fallen mit meinem unwissen ^^