Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

VBA Excel wyzwanie- makra

neke 09 Lis 2010 21:16 2525 11
  • #1 09 Lis 2010 21:16
    neke
    Poziom 9  

    Witam,

    Mam pewien problem z Visualem pod Excelem z którym nie mogę sobie poradzić.

    Mam dwa pliki Excela
    1. główny
    VBA Excel wyzwanie- makra

    2. baza
    VBA Excel wyzwanie- makra

    W pliku „glowny” w kolumnie B mam wpisane pewne numery identyfikacyjne. Dla każdego z tych numerów w kolumnach od L do W jest wpisany aktualny stan konta za dany miesiąc (gdzie kolumna L to styczeń, M-luty itd.)

    W pliku „baza” są przechowywane pewne wartości które chciałbym kopiować do pliku „główny” do komórki z odpowiednim miesiącem.

    Opiszę teraz obrazowo jak bym chciał by makro działało: W pliku „główny” chciałbym mieć przycisk po naciśnięciu którego program skopiuje pierwszy nr z kolumny B pliku "główny", odnajdzie ten nr w pliku „baza”, sprawdzi czy dla tego nru w kolumnie H jest napis „closed”. Jeżeli będzie tam ten napis skopiuje go do pliku „główny” do kolumny nazwanej obecnym miesiącem (od L do W- gdzie L to styczeń, M-luty itd). Jeżeli napisu nie będzie skopuje w miejsce miesiąca w pliku "główny" wartość z kolumny M pliku „baza”.

    Operacja ta zostanie przeprowadzona dla wszystkich numerów w kolumnie B pliku „główny”. Pominięte zostaną puste pola w kolumnie B.

    Będę niezmiernie wdzięczny za pomoc w rozwiązaniu problemu.
    Pozdrawiam,
    Neke

    0 11
  • #2 10 Lis 2010 07:42
    walek33
    Poziom 28  

    A co już masz zrobione? Najlepiej wrzuć jakiś przykładowy plik (bez tajnych danych) zamiast obrazków.

    0
  • #4 15 Lis 2010 00:27
    Ksysiek
    Poziom 14  

    Chciałbym zauważyć że dużo prościej by było gdybyś miał to w jednym skoroszycie (to tylko taka sugestia), ale jeśli już musisz mieć tak to zrób sobie w pliku "Główny" arkusz "Oblicz", w którym będziesz wpisywał różne formuły pomocnicze. Jeśli chodzi o samo makro to napisze gdy sam je znajdę w moich programach bo tak na pamięć to go teraz nie pamiętam.

    0
  • #5 15 Lis 2010 08:51
    walek33
    Poziom 28  

    A cóż to za przyczyna, że plik zwany baza tak drogo kosztuje? :cry:

    0
  • #6 15 Lis 2010 17:26
    neke
    Poziom 9  

    Ok,

    Przyjmijmy, że mogę skopiować dane z pliku baza do nowej zakładki pliku główny. Jak napisać takie makro, by uzyskać oczekiwany efekt?

    0
  • Pomocny post
    #7 15 Lis 2010 17:41
    adamas_nt
    Moderator Programowanie

    Przetestuj, czy o to chodzi (dwa pliki, jak zakładałeś).

    Code:
    Sub test()
    
    Dim plik As Workbook, baza As Workbook, wrs As Long
    Dim ostWrs As Long, kol As Integer
    kol = Month(Date) + 12
    Set plik = ThisWorkbook
    'zakładam, że oba pliki w tym samym katalogu
    Set baza = Workbooks.Open(plik.Path & "\base.xls")

    With plik.Sheets("OVERVIEW")
      ostWrs = .Range("B65536").End(xlUp).Row
      For i = 3 To ostWrs
        If .Cells(i, 2) <> "" Then
          kod = .Cells(i, 2).Value
          wrs = baza.Sheets("Base").Columns(5).Find(what:=kod, lookat:=xlWhole).Row
          If baza.Sheets("Base").Cells(wrs, 8) = "" Then
            MsgBox "Kod " & kod & " liczbę: " & baza.Sheets("Base").Cells(wrs, 13) & " kopiujemy do " & .Cells(i, kol).Address
          Else
            MsgBox "Kod " & kod & " tekst: " & baza.Sheets("Base").Cells(wrs, 8) & " kopiujemy do " & .Cells(i, kol).Address
          End If
        End If
      Next
    End With

    baza.Close savechanges:=False
    Set plik = Nothing: Set baza = Nothing
    End Sub

    0
  • #8 15 Lis 2010 20:04
    neke
    Poziom 9  

    Jesteśmy już chyba blisko. Nie kopiuje się natomiast nic pomimo iż msgbox komunikuje że coś tam kopiuje do kolumny W.

    Obecnie problem który widzę to:
    1. wartości nie kopiują się do pliku glowny
    2. nie widzę reguły która by rozpoznawała obecny miesiąc i kopiowała dane do odpowiedniej kolumny (od L doW)
    2. nie widzę regóły która kopiowała by zamiast liczby tekst z kolumny H pliku baza w przypadku jego istnienia( gdy w kolumnie H pliku baza jest tekst, program nie kopiuje wartości liczblowej z kolumny M lecz tekst z kolumny H)

    Dzięki za skrypt- myślałęm że już nikt nie da rady ;)

    0
  • Pomocny post
    #9 15 Lis 2010 20:18
    adamas_nt
    Moderator Programowanie

    1. Co i gdzie wyświetla komunikat. Pytanie czy się zgadza. Jeśli tak to przerób: zamiast

    Code:
    MsgBox "Kod " & kod & " liczbę: " & baza.Sheets("Base").Cells(wrs, 13) & " kopiujemy do " & .Cells(i, kol).Address
    wstaw przypisanie
    Code:
    .Cells(i, kol) = baza.Sheets("Base").Cells(wrs, 13)
    (to na końcu po lewej, to w środku po prawej stronie znaku równości. I w drugim przypadku tak samo.
    2. Przyjąłem miesiąc z aktualnej daty (możesz zmienić oczywiście)
    Code:
    kol = Month(Date) + 12
    Dodano po chwili: Aj, i tu się "rypnęło". Powinno być +11
    3. Patrz uważniej :)
    Code:
    If baza.Sheets("Base").Cells(wrs, 8) = "" Then
    sprawdza, czy pusta. Słowo "closed" można napisać z błędem, spacją na końcu itp. Możesz zmienić na <> "closed" bez przeplatania gałęzi.

    0
  • #10 16 Lis 2010 21:00
    neke
    Poziom 9  

    Ad1. Wciąż nie jest to dla mnie jasne- co powiniennem przerobić. "(to na końcu po lewej, to w środku po prawej stronie znaku równości. I w drugim przypadku tak samo."- się rozchodzi o to się, że w odniesieniu do powyższego to się nie wiem o co rozchodzi się :)

    Będę wdzięczny za korektę (wklejenie przerobionego) kodu. W pierwszym poście wkleiłem obie bazy, jak byś chciał skrypt swój przetestować.

    Po zaimplementowaniu Twojego kodu msgBox podaje informację, iż kopiuje pewne wartości do kilku wierszy kolumny V (kolumna V jest ok bo to jest listopad w pliku "glowny") po sprawdzeniu jednak co zostało skopiowane, okazuje się, że nic ani w pliku główny ani baza.

    Ad2. solved
    Ad3. Dzienx ;)

    Bajdełej,
    - czy "i" oznacza zmienną?
    - co oznacza "xl" bynajmniej nie na metkach w odzieżowym - np. xlWhole?

    0
  • Pomocny post
    #11 16 Lis 2010 22:11
    adamas_nt
    Moderator Programowanie

    Code:
    Sub test()
    
    Dim plik As Workbook, baza As Workbook, wrs As Long
    Dim ostWrs As Long, kol As Integer
    kol = Month(Date) + 11
    Set plik = ThisWorkbook
    Set baza = Workbooks.Open(plik.Path & "\base.xls")

    With plik.Sheets("OVERVIEW")
      ostWrs = .Range("B65536").End(xlUp).Row
      For i = 3 To ostWrs
        If .Cells(i, 2) <> "" Then
          kod = .Cells(i, 2).Value
          wrs = baza.Sheets("Base").Columns(5).Find(what:=kod, lookat:=xlWhole).Row
          If baza.Sheets("Base").Cells(wrs, 8) = "" Then
            .Cells(i, kol) = baza.Sheets("Base").Cells(wrs, 13)
          Else
            .Cells(i, kol) = baza.Sheets("Base").Cells(wrs, 8)
          End If
        End If
      Next
    End With

    baza.Close savechanges:=False
    Set plik = Nothing: Set baza = Nothing
    End Sub

    Poczytaj w pomocy o:
    1. Pętli For (szczególnie o: zmienna-licznik)
    2. Metodzie Find (Range.Find Method) i jej argumentach, lub naciśnij Ctrl+f i przyjrzyj się opcjom.

    0
  • #12 18 Lis 2010 21:20
    neke
    Poziom 9  

    Dziękuję serdecznie za rozwiązanie problemu oraz cenne i rzeczowe uwagi!

    Nikt nie dał rady problemowi, chociaż topic postawiłem na kilku forach- a niektóre miały w nazwie projektowanie vba dla zaawansowanych :) Jak nazwać w takim razie takie fora?- jak by to powiedział Najman- odpowiedzcie sobie retorycznie.

    Pozdrawiam,
    Neke

    0