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.

Excel makra wklejania

piotr1110 29 Lip 2009 11:29 4016 10
  • #1 29 Lip 2009 11:29
    piotr1110
    Poziom 8  

    Witam,
    W arkuszu 1 mam listę materiałów KolumnaA- index kolumnaB -nazwa (kilkaset pozycji) KolumnaC - wartości.
    Chciałbym aby do arkusza 2 (z arkusza 1) wklejały się tylko pozycje o kodzie początek 93* nazwie "FOLIA" oraz wartości z kolumnyC zmienione z jednostki mb na kg (w zależności od indexu np. 93-001 = C/72, 93-002 = C/15, 93-003 = C/13

    0 10
  • #3 29 Lip 2009 15:58
    piotr1110
    Poziom 8  

    Mógłby porosić o gotowca do wlejenia:

    index to zakres A8:A600
    nazwa to zakres B8:B600
    warości1 to zakres FW8:FW600
    warości2 to zakres FX8:FX600
    warości3 to zakres FY8:FY600
    warości4 to zakres FZ8:FZ600

    0
  • #4 29 Lip 2009 18:08
    adamas_nt
    Moderator Programowanie

    piotr1110 napisał:
    Mógłby porosić o gotowca
    Nie ma sprawy. Ale:
    1. Jest dla Ciebie okazja złapać o co w tych pętlach chodzi (kombinuj, pytaj).
    2. Jeśli chcesz gotowca, wpisz kilka wierszy danych do arkusza w układzie, jaki masz w oryginale (+ podpowiedź o co chodzi) i wrzuć na forum w postaci załącznika bez prowizji. Zaoszczędzi to wszystkim czasu, unikniemy pomyłek i niedomówień (nie wiem jak inni, ale pojęcia zielonego nie mam co też może być w zakresach: "wartości2", "wartości3" i co z tym zrobić)

    0
  • #5 30 Lip 2009 14:54
    piotr1110
    Poziom 8  

    napisałem: zależności od indexu np. 93-001
    dlaczego w module jest 92001?
    Wartości 2, Warości 3, to zużycie foli w kolejnych kwartałach

    Dodano po 19 [minuty]:

    jak zapisać index 93-020-001

    0
  • #6 30 Lip 2009 15:58
    adamas_nt
    Moderator Programowanie

    Musiałoby być cos takiego, sprawdź

    Code:
    Sub CopyCount()
    

    Const wrt01 As Single = 72
    Const wrt02 As Single = 15
    Const wrt03 As Single = 13
    Dim i As Integer, licznik As Integer, ark As String

    ark = "Arkusz2" ' nazwa arkusza docelowego
    licznik = 2 'pierwszy wiersz ark docelowego

    Sheets(ark).Range("A2:C" & Range("A2").End(xlDown).Row).ClearContents 'czysc zakres

    For i = 8 To 600 'tu ustawiasz Nr wierszy zakresu źródłowego
        If Left(Cells(i, 1), 2) = "93" And LCase(Left(Cells(i, 2), 5)) = "folia" Then
        'jeżeli kod zaczyna sie od "93" oraz
        '5 pierwszych znaków nazwy, zamienionych na małe litery = "folia"
           
            'przypisanie: arkusz.komórka docelowa = komórka źródłowa
            Select Case Right(Cells(i, 1), 2) 'sprawdzam dwa ostatnie znaki
            'i w zależności jakie są ich wartości dzielimy przez stałą zadeklarowaną na początku
                Case "01":  Sheets(ark).Cells(licznik, "C") = Cells(i, "FW") / wrt01
                            Sheets(ark).Cells(licznik, "D") = Cells(i, "FX") / wrt01
                            Sheets(ark).Cells(licznik, "E") = Cells(i, "FY") / wrt01
                            Sheets(ark).Cells(licznik, "F") = Cells(i, "FZ") / wrt01
                           
                Case "02":  Sheets(ark).Cells(licznik, "C") = Cells(i, "FW") / wrt02
                'i tu przepisujesz jak dla pierwszego, zmieniasz tyko dzielnik
               
                Case "03":  Sheets(ark).Cells(licznik, "C") = Cells(i, "FW") / wrt03
                'i jeszcze raz dla następnego warunku
               
                Case Else:  Sheets(ark).Cells(licznik, "C") = ""
                'tu też możesz nie musisz. Uruchamiany gdy nie jest spełniony zaden
                'z warunków
            End Select
           
            Sheets(ark).Cells(licznik, "A") = Cells(i, "A") 'indeks
            Sheets(ark).Cells(licznik, "B") = Cells(i, "B") 'nazwa
            licznik = licznik + 1
        End If
    Next
    Sheets(ark).Select
    End Sub
    Opisałem tak, że powinieneś się połapać. Nie pisałem przypisania dla następnych warunków, bo bez tego i tak jest długa a jak sam widzisz jest to dość oczywiste.
    Odnośnie indeksów: Makro sprawdza tylko dwa pierwsze i dwa ostatnie znaki. Długość (czyli co jest w środku) nie ma znaczenia.

    0
  • #7 31 Lip 2009 08:09
    piotr1110
    Poziom 8  

    93-020-001
    93-021-001
    Tak wyglądają kody dlatego środek jest kluczowy.
    Jest ich około 6 różnych. a pozostałe dzielę przez 72,5, tylko nie wiem
    jak zapisać kody pozostałe tzn. mające początek 93* próbowałem gwiazdkę ale nie działa.

    0
  • #8 31 Lip 2009 08:23
    adamas_nt
    Moderator Programowanie

    Można rozwinąć warunki instrukcji Select Case. Mamy:
    Select Case Right(Cells(i, 1), 2) 'sprawdzam dwa ostatnie znaki

    Można Np:
    Select Case Right(Cells(i, 1), 7) 'sprawdzam siedem znaków od prawej
    i wtedy:
    Case "020-001": polecenie(a) dzielenia przez wrt1
    Case "021-001": polecenie(a) dzielenia przez wrt1a
    itd
    Case Else : polecenie(a) 'TU wszystkie inne rozpoczynające się od "93" zgodnie z If Left(Cells(i, 1), 2) = "93" podanym na początku pętli.

    I wszystkie kody powinny być w tym (xx-xxx-xxx) formacie.
    Tylko nie jestem pewien, czy o to chodzi...

    0
  • #9 31 Lip 2009 12:15
    piotr1110
    Poziom 8  

    I wszystkie kody powinny być w tym (xx-xxx-xxx) formacie.

    ale wtedy wyskakuje błąd albo ucina otatnie dwa znaki

    0
  • #10 31 Lip 2009 17:01
    adamas_nt
    Moderator Programowanie

    adamas_nt napisał:
    wpisz kilka wierszy danych do arkusza w układzie, jaki masz w oryginale (+ podpowiedź o co chodzi) i wrzuć na forum w postaci załącznika bez prowizji. Zaoszczędzi to wszystkim czasu, unikniemy pomyłek i niedomówień

    0
  • #11 03 Sie 2009 07:15
    piotr1110
    Poziom 8  

    A B FW
    8 93-020-001 FOLIA 100 /13,1
    9 93-021-001 FOLIA 1 100 /66,0
    10 93-022-001 FOLIA 2 100 /11,8
    11 93-086-001 FOLIA 3 100 /72,5
    12 93-096-001 FOLIA 3 100 /72,5

    0