Kategorie szkoleń | Egzaminy | Kontakt
  • 2
  • 0
  • 1

Cześć!

Chcę napisać makro, które będzie tworzyło folder o nazwie umieszczonej w zaznaczonej komórce. Docelowo makro ma łączyć zawartość dwóch liczb z komórek, w jedną komórkę i zamieniać je na tekst. Kod, który już mam, robi to dobrze i kończy na zaznaczaniu komórki, w której jest już tekst, jaki ma być nazwą folderu. Używam w tym kodzie odwołań względnych, co powoduje użycie offsetu. Chcąc utworzyć folder o nazwie z komórki. Testowałem pogrubiony kod, jednak bez skutku - przy tym kodzie tworzą się foldery o nazwie "true", na bazie pustej komórki przesuniętej w prawo. Gdy dostosowałem wartość offsetu, napotykałem ten sam problem, dlatego podejrzewam, że popełniam gdzieś jakiś trywialny błąd.

Bardzo proszę o pomoc. ;)

Sub Makro5()
'
' Makro5 Makro
'

'

' Range("GS5").Select
' Selection.FormulaR1C1 = "=RC[-200]"
'Range("GS5").Select
ActiveCell.Offset(0, 200).Range("A1").Select
Selection.FormulaR1C1 = _
"=IF(RC[-200]=0,""0+000"",TEXT(RC[-200],""#+###""))&"" - ""&TEXT(RC[-199],""#+###"")"
Selection.Copy
' Application.Left = 52
' Application.Top = 48.25
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
ActiveSheet.Paste
Application.CutCopyMode = False

MkDir "C:\Users\Janusz\obliczenia\" & ActiveCell.Offset(0, 119).Range("A1").Select

 

End sub

Pozdrawiam.
Kuba.

Jakub_Pytka
  • Zapytał
  • @ Jakub_Pytka | 04.02.2020
    • 0
    • 0
    • 0

Odpowiedzi (2)

  • 1

Powinno pomóc:

https://www.altkomakademia.pl/baza-wiedzy/qna/discussion/9528/vba-automatycznie-uruchamiane-makro-tworzace-strukture-folderowsubfolderow#Comment_13287

 

 Zamiast Twojego MkDir spróbuj tak:

Dim FullPath As String
Dim PATH As Variant
Dim Folder As String
Dim i As Integer


FullPath = "C:\Users\Janusz\obliczenia\" & ActiveCell.Offset(0, 119).Value

PATH = Split(FullPath, "\")

For i = 0 To UBound(PATH)
Folder = Folder & PATH(i) & "\"
    If Dir(Folder, vbDirectory) = "" Then MkDir Folder
Next i



Tomasz_Kasprzycki
  • Odpowiedział
  • @ Tomasz_Kasprzycki | 05.02.2020
    • 2
    • 4
    • 8
  • 1

Trochę wskazówek ode mnie. :)

1) Zamiast stosować składnię Range.Select i Selection.cośtam, używaj bezpośrednio metody na zakresie: Range.cośtam. Używania metody Select należy unikać jak ognia - spowalnia ona jedynie kod, a niezmiernie rzadko ma faktycznie sensowne zastosowanie (np. gdy chcesz wskazać zakres użytkownikowi lub skopiować złożone formatowanie).

2) W konstrukcji ActiveCell.Offset(0, 200).Range("A1").Select dodatkowe wskazanie na Range("A1") (czyli tu: pierwszą komórkę zakresu) jest niepotrzebne, ponieważ ActiveCell z założenia jest pojedynczą komórką. Może to mieć sens przy zakresach wielokomórkowych (np. Selection.Range("A1").Select wybierze lewy górny róg zaznaczonego zakresu), choć lepiej wtedy odnieść się przez Selection.Cells(1).Select - robi to samo, ale jest zdecydowanie mniej mylące niż wskazanie na "A1". :)

3) Nie ma sensu używać formuł tam, gdzie to samo można łatwo osiągnąć z poziomu kodu, a jeżeli do czegoś faktycznie przydałaby się funkcja arkusza, lepiej skorzystać z klas WorksheetFunction lub Application (różnią się sposobem obsługi błędów, także warto poczytać, której w danym przypadku lepiej użyć).

4) Tworzy się folder o nazwie TRUE, ponieważ zamiast odnieść się do wartości komórki (ActiveCell.Offset(0, 119).Value), używasz metody Select - a ona wybiera wskazany zakres i potwierdza to "prawdą", która zostaje zwrócona jako tekst.

Spróbuj czegoś takiego:

Sub tworz_folder()

folder = "C:\Users\Janusz\obliczenia\"

With ActiveCell
   .Offset(0, 200).Value = IIf(.Value = 0, "0+000", Format(.Value, "#+###")) & " - " & Format(.Offset(0, 1).Value, "#+###")
   folder = folder & .Offset(0, 119).Value
End With

If Dir(folder, vbDirectory) = "" Then MkDir folder

End Sub

 

 
Mirosław_Janiak
  • Odpowiedział
  • @ Mirosław_Janiak | 05.02.2020
    • 1
    • 7
    • 1
Komentarze
Bardzo dziękuję za pomoc!
Skomentował : @ Jakub_Pytka ,10.02.2020
  • 0
  • 0
  • 0