Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

pogram w VBA kopiujący komórki pomiędzy plikami

AJs 20 Mar 2009 14:01 12940 13
  • #1
    AJs
    Level 11  
    Witam. uczę się programowania od 2 dni bo potrzebowałem ułatwić sibie zadanie. stworzyłem takie program

    Code:

    Sub konta()
    Dim numer As String
        Dim wiersz, kolumna As String
    Dim x, y As Long
    Dim a As Byte
    Dim varWcisniety, varID As Variant

    podaj:
    podajnr.Show
    numer = Range("A29")
    If numer = "" Then
    varWcisniety = MsgBox("Nie podałeś numeru", vbRetryCancel + vbInformation, "Błąd!") 'błąd z pytaniem co chcesz zrobić
    End If
    Select Case varWcisniety
    Case 4
    GoTo podaj
    Case 2
    GoTo koniec
    End Select
    Range("A29").Value = Empty


    Windows("Zlecenia wystawione TE 2009.xls").Activate 'przełączenie się do innego pliku

    Sheets("RZ").Select 'przełączenie się do arkusza



    If Cells(numer, 9) = "" Then 'sprawdzenie czy jest takie zlecenie
    MsgBox "Podaj inny numer!", vbOKOnly + vbInformation, "Nie ma takiego konta!"
    GoTo podaj
    End If
    Range(Cells(numer, 9), Cells(numer, 15)).Copy

    Windows("automatycy.xls").Activate 'przełączenie do poprzedniego pliku
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
    koniec:

    End Sub

    Private Sub OK_Click()
    numer = okno1
    okno1.Value = Empty
    podajnr.Hide
    Windows("automatycy.xls").Activate
    Range("A29") = numer
    End Sub




    Program otwiera okno, podaje numer zlecenia, które jest jednocześnie numerem wiersza. Przełącza się do drugiego okna do arkusza RZ i sprawdza czy te komorki, ktore mają być skopiowane nie są puste. Następnie kopiuje je i wraca do okna pliku gdzie mają być wklejone i wkleja je spacjalnie same wartości. Problemy mam takie: Po pierwsze to program skopiuje te komorki pod warunkiem, że będę miał włączony ten plik. Po drugie jak widać w kodzie niewiedziałem jak zrobić żeby zmienna "numer" w general miała wartość nadaną po kliknięciu przycisku :/ (rozwiązałem to w ten sposób że wklejam wartość okienka do komorki A29 a po z Useform wartość zapisuje jako numer i czyści A29). może ktoś mi podpowiedzieć w jaki sposób poprawić to??[/code]
  • #2
    mat_ed
    Level 43  
    :arrow: adams_nt napisał:

    Quote:

    Po pierwsze: Załóż nowy temat
    Po drugie:
    Kod:
    podajnr.Show
    numer = Range("A29")

    Tu otwierasz UserForm (ładowanie pewnie jest w innej części kodu) i nie wiemy co tam się dzieje Smile po czym pobierasz wartość z komórki. Teraz mamy domyślać się o co chodzi... Napisz trochę więcej.
  • #3
    adamas_nt
    Moderator of Programming
    1. Kopiowanie jest możliwe tylko przy otwartych plikach. Możesz otwierać je i zamykać w kodzie Np.
    Code:
    Workbooks.Open Filename:=ThisWorkbook.Path & "\Zlecenia wystawione TE 2009.xls" 'jezeli w tej samej lokalizacji
    
    'tutaj kopiowanie i wklejanie

    Workbooks("Zlecenia wystawione TE 2009.xls").Close (savechanges = False)'zamykam plik bez zapisywania zmian


    2. Do nadania wartości zmiennej numer wykorzystał bym ImputBox
    Code:
    podaj:
    
    numer = InputBox("Podaj numer  ", "jakiś napis")
    If numer = "" Then
    varWcisniety = MsgBox("Nie podałeś numeru", vbRetryCancel + vbInformation, "Błąd!") 'błąd z pytaniem co chcesz zrobić
        If varWcisniety = vbCancel Then Exit Sub
        GoTo podaj
    End If
  • #4
    marek003
    Level 40  
    Ja go chyba trochę zrozumiałem.

    Troszeczkę inaczej bym to napisał (mniej tekstu - po co tak gmatwać)
    Stwórz okienko UserForm1 z jednym textbox'em przyciskiem
    Pod przyciskiem (kodem do przycisku) wklej coś takiego.

    Przejrzyj wcześniej komentarze i dostosuj do twoich warunków.

    Code:
    Private Sub CommandButton1_Click()
    

    GetObject ("c:\Zlecenia wystawione TE 2009.xls") 'ścieżka dostępu do pliku

    numer = TextBox1.Text 'przypisanie do numeru liczby z okienka

    If numer = "" Then   'sprawdzenie czy jest coś wpisane
        odp = MsgBox("Nie podałeś numeru", vbOKOnly + vbInformation, "Błąd!")
        GoTo koniec
    End If

    Workbooks("Zlecenia wystawione TE 2009.xls").Activate 'otworzenie arkusza w pamieci

    If Sheets("RZ").Cells(numer, 9) = "" Then    'sprawdzenie czy jest takie zlecenie
        MsgBox "Podaj inny numer!", vbOKOnly + vbInformation, "Nie ma takiego konta!"
        GoTo koniec
    End If

    Range(Cells(numer, 9), Cells(numer, 15)).Copy 'kopiowanie danych

    Workbooks("automatycy.xls").Activate 'przełączenie się miedzy arkuszami

    Sheets("Arkusz1").Range("a1").Select  'ustawienie pozycji (nie mam pojecia gdzie chcesz to wkleić)
    ActiveSheet.Paste 'wklejenie danych

    UserForm1.Hide 'zamknięcie okienka

    koniec:
    Workbooks("Zlecenia wystawione TE 2009.xls").Close 'zamknięcie otwartego w pamięci arkusza

    End Sub


    Czy o to ci chodzi?
    Można też wykorzystac to co podał kolega adamas_nt
  • #5
    adamas_nt
    Moderator of Programming
    Zaraz, zaraz. To jest projekt w VB a nie kod w arkuszu?
    Jeśli tak, to na początek zmień w sekcji General (zaraz po instrukcji Option Explicit)
    Code:
    Dim numer As String 
    na
    Code:
    Public numer As String 
    Wtedy zmienna będzie widoczna we wszystkich modułach i formach. Kodowanie w VB i w VBA "nieco" się różni. Dlatego chcielibyśmy wiedzieć z czym mamy do czynienia...
  • #6
    AJs
    Level 11  
    No dobrze marek myślę że by działało tylo jest jeszcze taki myk, że w tym pliku co z niego pobieram dane jest pełno makr... po włączeniu jego niema takiego arkusza "RZ". dopiero po uruchomieniu makra :rejestr" jest ten arkusz. tak więc czy pomiędzy tym:
    Code:

    Workbooks("Zlecenia wystawione TE 2009.xls").Activate 'otworzenie arkusza w pamieci

    a tym:
    Code:

    If Sheets("RZ").Cells(numer, 9) = "" Then    'sprawdzenie czy jest takie zlecenie
        MsgBox "Podaj inny numer!", vbOKOnly + vbInformation, "Nie ma takiego konta!"
        GoTo koniec
    End If

    można odpalić makro "rejestr" dostępne w tym pliku?

    adamas_nt tego mi było trzeba. teraz niemusze kombinować z tym numerem :D
  • #7
    adamas_nt
    Moderator of Programming
    Można tak
    Code:
    Application.Run "'Nazwa Pliku.xls'!Nazwa_Makra"
    
    Workbooks("Nazwa Pliku.xls").Close

    Jeżeli wykonywane są dalsze operacje na tym pliku, to usuń drugą linijkę.
  • #8
    AJs
    Level 11  
    Wielkie dzienki. prawie spać niemogłem przez tą jedną linijkę :D jeszcze dwa pytania:
    1.
    Code:
    Workbooks("Zlecenia wystawione TE 2009.xls").Close

    zamyka ten plik w pamięci ale pyta się czy zapisać zmiany... można to gdzieś ustalić żaby nie zapisywało zmian i zamykało?
    2. żeby skopiować to w tą komurkę, która była zaznaczona przed włączeniem makra muszę nadać zmiennej wartości, wiem że do tego jest activecell ale niewiem jak się tym posłużyć :/ niby proste a niewychodzi mi :/
  • #9
    adamas_nt
    Moderator of Programming
    1. Już było wyżej. Masz do wyboru
    Code:
    Workbooks("Zlecenia wystawione TE 2009.xls").Close SaveChanges:=False
    
    Workbooks("Zlecenia wystawione TE 2009.xls").Close (SaveChanges = False)

    2. Z aktywną komórką łatwo o pomyłkę ale jak prosisz
    Code:
    NazwaZmiennej = ActiveCell.Value
  • #10
    AJs
    Level 11  
    Więc na początku programu daje
    Code:
    wiersz = ActiveCell.Value
    a tam gdzie wklejam daje
    Code:
    Range(wiersz).Select
    
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False

    ale chyba jest cos nie tak bo niedziala i pokazuje na ten drugi kod :/
  • #11
    adamas_nt
    Moderator of Programming
    Code:
    Range(wiersz).Select 

    A powinno być Np dla A29, gdzie wiersz=29
    Code:
    Range("A29").Select 'lub
    
    Range("A" & wiersz).Select 'wartość wiersza ze zmiennej
    Range(Cells(wiersz, 1)).Select ' lub
    Cells(wiersz, 1).Select 'bez Range
  • #12
    marek003
    Level 40  
    Trochę i ja się uczę VBA wraz z autorem (i nie nadążam odpowiadać - co prawda nie śledzę non stop) ale...

    Jeżeli chcesz przypisać adres komórki do zmiennej to musisz to zrobić inaczej:
    Code:
    cel = ActiveCell.Address


    Value to wartość

    Później możesz skorzystać z
    Code:
    Range(cel).Select  
    
    ActiveSheet.Paste


    Druga rzecz:

    Z tą formułą jest odwrotnie (przynajmniej na moim 2002 jest odwrotnie). Aby pliku nie zapisać trzeba użyć True.
    Code:
    Workbooks("Zlecenia wystawione TE 2009.xls").Close (savechanges = True)

    Jeżeli będzie false jak sugeruje adamas_nt to nastąpi zapisanie zmian.

    Docelowo napisał bym ten programik tak (dodam że sprawdza jeszcze czy oprócz "nic-nie-wpisania" ktoś wpisał liczbę całkowitą i większą od zera):

    Code:
    Sub zabawa()
    

    cel = ActiveCell.Address 'zapis adresu komórki gdzie ma być wklejona

    numer = "" 'ustawienie parametru numer na "nic"

    Start:

    numer = InputBox("Proszę podać numer (dodatnią liczbę całkowitą).", "Dane", numer)

    If numer = "" Then   'sprawdzenie czy jest coś wpisane
        odp = MsgBox("Nie podałeś numeru lub anulowałeś działąnie." & Chr(10) & Chr(10) & "Chcesz spróbować jeszcze raz ?", vbYesNo + vbInformation, "Pytanie")
        If odp = vbYes Then GoTo Start Else: GoTo koniec
    End If

    If IsNumeric(numer) = False Or InStr(numer, ",") <> 0 Or InStr(numer, ".") Or numer <= 0 Then 'Sprawdzenie czy to numer całkowity i dodatni i większy od zera a . dla excela na angielskich kompach
    MsgBox "Podana wartość nie spełnia warunków." & Chr(10) & Chr(10) & "Popraw!", vbOKOnly + vbInformation, "Uwaga!"
    GoTo Start
    End If

    Workbooks.Open Filename:="c:\Zlecenia wystawione TE 2009.xls" 'otworzenie pliku

    Application.Run "'Zlecenia wystawione TE 2009.xls'!Makro1" 'uruchomienie makra

    Workbooks("Zlecenia wystawione TE 2009.xls").Sheets("RZ").Activate 'nie wiadomo gdzie zakończy makro więc aktywacja arkusza

    If Sheets("RZ").Cells(numer, 9) = "" Then    'sprawdzenie czy jest takie zlecenie
        MsgBox "Podaj inny numer!", vbOKOnly + vbInformation, "Nie ma takiego konta!" 'info popraw
        Workbooks("Zlecenia wystawione TE 2009.xls").Close (savechanges = True) 'zamknięcie skoroszytu
        GoTo Start 'skok do początku
    End If

    Sheets("RZ").Range(Cells(numer, 9), Cells(numer, 15)).Copy 'kopiowanie danych

    Workbooks("automatycy.xls").Activate 'przełączenie się miedzy arkuszami

    Range(cel).Select  'ustawienie kursora na pozycji cel jeżeli inne makro lub coś innego by coś namieczało
    ActiveSheet.Paste 'wklejenie danych

    Workbooks("Zlecenia wystawione TE 2009.xls").Close (savechanges = True) 'zamknięcie otwartego pliku bez z zapisu

    koniec:

    End Sub

    "Zabawa" z czyszczeniem numer'u na początku związana jest z późniejszym wykorzystaniem zmiennej jako wartość defaultową w imputbox. Zabieg ten jest po to aby ktoś, kto coś wpisze zobaczył co wpisał. Inaczej po powtórnym uruchomieniu inputbox'u byłoby czysto - bez wpisanej wcześniej wartości.


    Jedna rzecz mnie jeszcze ciekawi. Jak sprawdzić czy plik jest już otwarty bo powyższa procedura zaczyna się pytać jeżeli plik "zlecenia..." jest otwarty.

    A na marginesie kwestia sprawdzenia czy coś jest "integer". Jest jakaś komenda na to, czy trzeba kombinować? Może są jakieś inne prostsze kombinacje niż moje?
  • #13
    adamas_nt
    Moderator of Programming
    Z tym zamknięciem bez zapisywania to rzeczywiście nie wszystko jedno. Prawidłowa składnia
    Code:
    Workbooks("Zlecenia wystawione TE 2009.xls").Close SaveChanges:=False
  • #14
    AJs
    Level 11  
    Przepraszam że tak późno sie odzywam ale niemiałem czasu. już wszystkie zmiany wprowadziłem i programik działa idealnie. DZIEKI CHŁOPAKI ;) a mam dla Was jeszcze rebusik: ten plik z makrem rejestr służy do wystawiania zleceń i każdemu nowemu zleceniu nadaje kolejny numer (myśle że to niejest trudne) ale na innym komputerze z tym samym plikiem kiedy ktoś wystawi zlecenie to u mnie jest ono też widoczne i zapobiega to nadaniu jednego numeru dwum zleceniom. Wiecie jak to jest zrobione??