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

Mam ogromny problem, którego moja wiedza nie pozwala rozpracować.
Jest lista kolejnych adresów: miasto, ulica, nr domu. Niektóre są kolejne np. Jasna 1, 2, 3, 5, 7, 12, 14, czasem tylko parzyste lub nieparzyste. Chodzi mi o to, że potrzebuję je pogrupować od - do ze znacznikiem P (jeżeli tylko parzyste), N (jeżeli tylko nieparzyste), oraz W (jeżeli kolejne).
Teoretycznie wyglądałoby to tak:


Ciechanów Jasna 1 do 3 W
Ciechanów Jasna 5 do 7 N
Ciechanów Jasna 8 do 16 P
Ciechanów Jasna 17 do 17 N
Ciechanów Jasna 18 do 24 P

Taki "ręczny" przykład w załączonym pliku.

Załączniki

  • xlsx

    Ulice.xlsx ( 11K )
Marek_Pawłowski_jikr
  • Zapytał
  • @ Marek_Pawłowski_jikr | 24.08.2017
    • 1
    • 0
    • 0
Komentarze (2)
Załącznik by się przydał :)
Skomentował : @ Mirosław_Janiak ,24.08.2017
  • 1
  • 7
  • 1
Prosty excel, Kolumna z miastem, kolumna z ulicą i kolumna z serią cyfr kolejnych, z przerwami, i pojedynczych. Oczywiście dla każdej z ulic. jak to w życiu. przykładowego Excela mogę przesłać mailem pewnie mi bramka nie przepuszcza :(
Skomentował : @ Marek_Pawłowski_jikr ,24.08.2017
  • 1
  • 0
  • 0

Odpowiedzi (2)

  • 0

Nie mogę dodać Excela. :(

Marek_Pawłowski_jikr
  • Odpowiedział
  • @ Marek_Pawłowski_jikr | 24.08.2017
    • 1
    • 0
    • 0
Komentarze
Też mam ten problem pod Firefoxem, w moim przypadku pomogła Opera. Szewc bez butów chodzi, jak to zwykle bywa ;)
Skomentował : @ Mirosław_Janiak ,24.08.2017
  • 1
  • 7
  • 1
  • 1

No to lecimy z kodem - optymistycznie założę, że poradzisz sobie z samym jego uruchomieniem. :) Makro działa na stałym układzie kolumn (miasto, ulica, numer, od, do, znak), arkusz powinien zawierać tylko wiersze z adresami. Po wykonaniu odfiltruj niepuste wiersze w kolumnie "znak", to powinna być Twoja lista.

Nie wiem, na ile to istotne, ale np. w przypadku ciągu {1,2,3,4,6,8,9,10,11}, numery 4 i 8 zostaną włączone do pierwszego zakresu, w którym będą pasowały - czyli wynikiem będzie 1-4W, 6-8P, 9-11W, a nie 1-3W, 4-6P, 8-11W.

Sub adresy()

'sortujemy miasto, ulicę i numer
With ActiveSheet.Sort
   With .SortFields
      .Clear
      .Add Key:=Range("A:A")
      .Add Key:=Range("B:B")
      .Add Key:=Range("C:C")
   End With
   .SetRange Range("A:C")
   .Header = xlYes
   .Apply
End With

zmiana = True 'zmienna wskazuje, czy trzeba pobrać nowy adres i numer
kol = 3 'kolumna z numerami
w = 2 'aktualnie badany wiersz
w_max = ActiveSheet.UsedRange.Rows.Count 'ostatni wiersz

'czyścimy kolumny z wynikami
Range(Cells(w, kol + 1), Cells(w_max, kol + 3)) = Empty

'rozpoczynamy pętlę pwechodzącą przez kolejne wiersze
Do
   Set kom = Cells(w, kol) 'zmienna wskazująca na aktualnie badaną komórkę
   nr = kom 'numer w tej komórce
   
   'sprawdzamy, czy pole z numerem nie jest puste
   If nr <> Empty Then
      'sprawdzamy parzystość numeru
      Select Case nr Mod 2
         Case 0
            znak = "P"
         Case Else
            znak = "N"
      End Select
   
      'sprawdzamy, czy zmienił się adres (miasto i/lub ulica) i jeśli tak, pobieramy nowe dane
      If zmiana Then
         'kom.Interior.Color = vbYellow 'przydatne w trybie "Step Into" (F8)
         miasto = kom.Offset(0, -2)
         ulica = kom.Offset(0, -1)
         w_tmp = kom.Row
         nr_min = nr
         
         zmiana = False
      End If
   
      'jeśli adres w kolejnym wierszu jest taki sam, badamy zależność między numerami
      If miasto = kom.Offset(1, -2) And ulica = kom.Offset(1, -1) Then
         Select Case kom.Offset(1, 0)
            Case nr + 1
               znak = "W"
            Case nr + 2
               'znak mamy już ustalony i nie chcemy wywoływać zmiany, więc nie robimy nic :)
            Case Else
               'większy skok w numeracji, wymuszamy zapis wyniku
               zmiana = True
         End Select
      Else
         'zmienił się adres, wymuszamy zapis wyniku
         zmiana = True
      End If
      
      'jeśli zmienił się adres lub ciąg numeracji został przerwany, zapisujemy wynik w wierszu rozpoczynającym dany ciąg
      If zmiana Or (znak_tmp <> znak And znak_tmp <> Empty) Then
         Cells(w_tmp, kol + 1) = nr_min
         Cells(w_tmp, kol + 2) = nr
         'dodatkowy warunek dla przypadków jednowierszowych (od=do)
         If znak_tmp = Empty Then znak_tmp = znak
         Cells(w_tmp, kol + 3) = znak_tmp
         'Cells(w_tmp, kol).Interior.ColorIndex = xlColorIndexNone 'przydatne w trybie "Step Into" (F8)
         
         znak_tmp = Empty
         zmiana = True
      Else
         znak_tmp = znak
      End If
   Else
      'jeśli numer był pusty
      kom.Offset(0, 3) = "brak numeru"
   End If
  
  'przechodzimy do kolejnego wiersza
   w = w + 1
   'Cells(w, kol).Select 'przydatne w trybie "Step Into" (F8)
Loop Until w > w_max

End Sub

 

Mirosław_Janiak
  • Odpowiedział
  • @ Mirosław_Janiak | 25.08.2017
    • 1
    • 7
    • 1