Excel Forum - Porady, Pomoc,  Excel Help, Excel FAQ Strona Główna
 FAQ  RegulaminRegulamin  Szukaj   Użytkownicy   Grupy   Rejestracja   Profil   Twoje wiadomości   Zaloguj 


Poprzedni temat «» Następny temat
Przesunięty przez: Tajan
24-01-2023, 14:31
Kopiowanie plików na podstawie wartości komórki
Autor Wiadomość
MMriuSS 
Fan Excela


Posty: 92
Wysłany: 24-01-2023, 10:40   Kopiowanie plików na podstawie wartości komórki

Witam!

Mam kod, który kopiuje pliki, jeżeli w nazwie jest słowo "Komunikat":
Kod:

Sub KopiujPlikiPomiedzyFolderami()

    Dim objFSO As Object
    Dim objFolder As Object
    Dim objFile As Object

    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFSO.GetFolder("E:\X\")

    Application.ScreenUpdating = False
    For Each objFile In objFolder.Files
       If InStr(1, objFile.Name, "Komunikat") > 0 Then
          objFSO.CopyFile objFile, "E:\Y\"
        End If
    Next

    'Clean up!
    Set objFolder = Nothing
    Set objFile = Nothing
    Set objFSO = Nothing

    Application.ScreenUpdating = True
End Sub


Pomimo wielu prób nie wiem, jak go przerobić, żeby kopiował plik na podstawie wartości w komórce A1.

Z góry dziękuję za pomoc i wskazówki.

Pozdrawiam
ID posta: 424525 Skopiuj do schowka
 
 
Tajan


Pomógł: 5234 razy
Posty: 11412
Wysłany: 24-01-2023, 11:27   

Można tak:
Kod:
If InStr(1, objFile.Name, Range("A1").Value) > 0 Then

Przedtem dobrze byłoby sprawdzić, czy komórka A1 nie jest pusta, np.:
Kod:
If Range("A1").Value = "" Then Exit Sub
ID posta: 424538 Skopiuj do schowka
 
 
MMriuSS 
Fan Excela


Posty: 92
Wysłany: 24-01-2023, 11:37   

Tajan napisał/a:
Można tak:
Kod:
If InStr(1, objFile.Name, Range("A1").Value) > 0 Then



Dzięki za zainteresowanie, ale polecenie

Kod:
If InStr(1, objFile.Name, Range("A1").Value) > 0 Then


w dalszym ciągu odnosi się do nazwy pliku, a mnie chodzi o to, żeby kod dotarł do
Kod:
Range("A1").Value

w każdym pliku i jeżeli

Kod:
Range("A1").Value = "X"


to wówczas nastąpi kopiowanie pliku do nowej lokalizacji.
ID posta: 424539 Skopiuj do schowka
 
 
Tajan


Pomógł: 5234 razy
Posty: 11412
Wysłany: 24-01-2023, 11:45   

Pytanie było nieprecyzyjne. Zresztą, nadal jest. Skoro sprawdzamy komórkę, to należy określić z jakiego arkusza. Czy bierzemy pod uwagę jakąś nazwę, czy tylko jego położenie w pliku- czyli np. 1?
ID posta: 424541 Skopiuj do schowka
 
 
MMriuSS 
Fan Excela


Posty: 92
Wysłany: 24-01-2023, 11:53   

Sorki, może rzeczywiście użyłem skrótów myślowych. W każdym pliku jest jeden arkusz załóżmy, że nazywa się "Arkusz1". W przypadku otwarcia pliku zawsze będzie miał status ActiveSheet. W kodzie nie bierzemy pod uwagę nazwy arkusza. Coś w tym stylu:

Kod:
Workbook.Open
If ActiveSheet.Range("A1").Value = "a" Then Workbook.Copy do ścieżki "E:\Y\"
ID posta: 424542 Skopiuj do schowka
 
 
Tajan


Pomógł: 5234 razy
Posty: 11412
Wysłany: 24-01-2023, 12:17   

To może tak:
Kod:
Sub KopiujPlikiPomiedzyFolderami()

    Dim objFSO As Object
    Dim objFolder As Object
    Dim objFile As Object
    Dim toCopy As Boolean

    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFSO.GetFolder("E:\X\")

    Application.ScreenUpdating = False
    For Each objFile In objFolder.Files
       If LCase(objFile.Name) Like "*.xl?*" Then
          With Workbooks.Open(objFile.Path)
              If .Sheets(1).Range("A1").Value = "Szukana wartość" Then
                 .SaveCopyAs "E:\Y\" & objFile.Name
              End If
              .Close
            End With
        End If
    Next

    'Clean up!
    Set objFolder = Nothing
    Set objFile = Nothing
    Set objFSO = Nothing

    Application.ScreenUpdating = True
End Sub
ID posta: 424545 Skopiuj do schowka
 
 
MMriuSS 
Fan Excela


Posty: 92
Wysłany: 24-01-2023, 12:42   

Coś nie chce mi działać.

Musimy badać, czy plik ma rozszerzenie .xls/xlsx?

Kod:
If LCase(objFile.Name) Like "*.xl?*" Then


Moje pliki są plikami .csv

Tu chyba w dalszym ciągu odnosimy się do nazwy pliku (objFile.Name)?

Zmieniłem "*.xl?*" na "*.cs?*" oraz "objFile.Name" na "objFile" oraz ".Sheets(1).Range("A1")" na "ActiveSheet.Range("A1")" ale nie działa.
Arkusze mają różne nazwy i musimy się odwoływać do aktywnego arkusza.

Kod:
.SaveCopyAs "E:\Y\" & objFile.Name
ID posta: 424546 Skopiuj do schowka
 
 
MMriuSS 
Fan Excela


Posty: 92
Wysłany: 24-01-2023, 12:57   

Pobawiłem się trochę kodem i już wiem, że przyczyną jest prawdopodobnie format pliku .csv
Przy plikach .xlsx kod działa świetnie. Dzięki Tajan o to chodziło. A jak zrobić, żeby to działało na pliki.csv?
ID posta: 424547 Skopiuj do schowka
 
 
MMriuSS 
Fan Excela


Posty: 92
Wysłany: 24-01-2023, 13:01   

Tak to wygląda:

Kod:
Sub KopiujPlikiPomiedzyFolderami()

    Dim objFSO As Object
    Dim objFolder As Object
    Dim objFile As Object
    Dim toCopy As Boolean

    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFSO.GetFolder("E:\A\")

    Application.ScreenUpdating = False
    For Each objFile In objFolder.Files
       If LCase(objFile.Name) Like "*.xl?*" Then
          With Workbooks.Open(objFile.Path)
              If .ActiveSheet.Range("A1").Value = "DATA_OD" Then
                 .SaveCopyAs "E:\AAA\" & objFile.Name
              End If
              .Close
            End With
        End If
    Next

    'Clean up!
    Set objFolder = Nothing
    Set objFile = Nothing
    Set objFSO = Nothing

    Application.ScreenUpdating = True
End Sub


Zmieniłem odniesienie na ActiveSheet
ID posta: 424548 Skopiuj do schowka
 
 
Tajan


Pomógł: 5234 razy
Posty: 11412
Wysłany: 24-01-2023, 13:26   

Ja nie wiem ja nie wiem jakie pliki masz w tym folderze, więc uznałem, ze chodzi o skoroszyty Excela. Ale skoro to pliki csv to należy zastosować inne podejście. Przydałby się przykładowy plik csv oraz przykład tekstu, który ma być porównany z plikiem, bo być może tu tkwi problem.
Spróbuj tak:
Kod:
Sub KopiujPlikiPomiedzyFolderami()

    Dim objFSO As Object
    Dim objFolder As Object
    Dim objFile As Object
    Dim toCopy As Boolean

    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFSO.GetFolder("E:\X\")
   
    Application.ScreenUpdating = False
    For Each objFile In objFolder.Files
       If objFSO.GetExtensionName(objFile) = "csv" Then
          With Workbooks.Open(objFile)
                 toCopy = (.Sheets(1).Range("A1").Value = "TEXT DO WYSZUKANIA")
              .Close False
          End With
          If toCopy Then objFSO.CopyFile objFile, "E:\Y\"
        End If
    Next

    'Clean up!
    Set objFolder = Nothing
    Set objFile = Nothing
    Set objFSO = Nothing

    Application.ScreenUpdating = True
End Sub
 

Skoro arkusze mają różne nazwy, to odwołanie do pierwszego (Sheets(1)) powinno być zawsze OK.
ID posta: 424549 Skopiuj do schowka
 
 
MMriuSS 
Fan Excela


Posty: 92
Wysłany: 24-01-2023, 13:42   

Proszę bardzo, uprzejmie przesyłam plik :)
Chodzi mi o tekst z komórki A1 "DATA_OD"

test.csv
Pobierz Plik ściągnięto 8 raz(y) 85 Bajtów

ID posta: 424553 Skopiuj do schowka
 
 
Tajan


Pomógł: 5234 razy
Posty: 11412
Wysłany: 24-01-2023, 14:04   

No, nie wiem... Powyższe makro powinno działać. A spróbuj zamienić:
Kod:
 toCopy = (.Sheets(1).Range("A1").Value = "TEXT DO WYSZUKANIA")

na:
Kod:
toCopy = InStr(1, .Sheets(1).Range("A1").Value, "DATA_OD") > 0
ID posta: 424555 Skopiuj do schowka
 
 
MMriuSS 
Fan Excela


Posty: 92
Wysłany: 24-01-2023, 14:19   

D Z I A Ł A !!!!!

:clap :danke

Tajan, bardzo Ci dziękuję za pomoc, pozdrawiam serdecznie
ID posta: 424558 Skopiuj do schowka
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Theme xandgreen created by spleen& Programosy modified v0.3 by warna
Opieka techniczna www.wip.pl

Archiwum

Strona używa plików cookies.

Kliknij tutaj, żeby dowiedzieć się jaki jest cel używania cookies oraz jak zmienić ustawienia cookie w przeglądarce.
Korzystając ze strony użytkownik wyraża zgodę na używanie plików cookies, zgodnie z bieżącymi ustawieniami przeglądarki.
Sprawdź, w jaki sposób przetwarzamy dane osobowe