2016-08-11 40 views
5

ROZWIĄZANY: Błąd został spowodowany poprzez manipulowanie właściwości znaleźć w innym miejscuExcel VBA Abnormal Behavior of Cells.Find na scalonych komórek

jestem bardzo nowy w świecie VBA i miałem pytanie o jakimś nienormalnym zachowaniem funkcja Range .Find, której doświadczam. Mam kod, który wywołuję podprogramem jak poniżej.

For i = 2 To UBound(pullDataPckg) 
     For j = 1 To UBound(section) 
      Set cell = dataSheet.Cells.Find(What:=section(j)) 
      'Below returns nothing on call 2, works for call 1 
      'Set cell = dataSheet.Cells.Find(What:="Value from section(j) in second call") 

      If Not cell Is Nothing Then 
       'Do some stuff 
      End If 
     Next 
Next 

pullDataPckg i section są dwie tablice ciąg, dataSheet jest obiektem arkusz i kod jest zlokalizowane w Sub że nazywam się ciągnąć wartości danych z arkusza.

Nieprawidłowe zachowanie mam przeżywa to, że Find zawsze zwraca komórkę jako Nothing na moim drugim wywołaniu sub (Komórki wyszukiwane są wszystkie połączone komórki, które znam są w arkuszu i gdybym wtedy rozdzielić komórki metoda find jest w stanie zlokalizować komórkę).

Jeśli jednak zamiast tego użyję dataSheet.Range("A1:R999").Find(What:=section(j)), metoda pomyślnie znajdzie komórkę. Tak więc problem zdawał się być z właściwością Cells, gdy jest używany z połączonymi komórkami.

Wywołuję podrzędny dwukrotnie na tym samym arkuszu roboczym, więc dodałem wywołanie dataSheet.Cells.Find(What:="Known Value in section array of Second Sub Call") i stwierdziłem, że ten sam kod po wykonaniu w pierwszym wywołaniu podrzędnym pomyślnie odnalazł scaloną komórkę, podczas gdy po wywołaniu w drugim wywołaniu podrzędnym nie powiodło się. znajdź scaloną komórkę (jeśli komórka została odłączona, zadziałała dla obu połączeń).

Miałem nadzieję, że ktoś może rzucić trochę światła na to, dlaczego metoda znalezienia się nie powiedzie, gdy zostanie wywołana do właściwości Cells tylko w drugim wywołaniu podrzędnym i tylko z połączonymi komórkami. Ponieważ wartość testu jest zakodowana na stałe, można ją znaleźć za pomocą właściwości Range/rozłączając komórkę, a ja przekazuję ten sam arkusz do obu wywołań Naprawdę drapię się w głowę, jak metoda Find mogła zawodzić tylko podczas wyszukiwania scalonego komórka w drugim wywołaniu.

Edycja: nie są 5 połączone komórki, z których każda ma szerokość, która rozciąga się na: R i wysokość 2. Przed rozpoczęciem pętli jest wywołanie Sub zapełnia Tablica pullDataPckg otwierając skoroszytu , przenoszenie informacji ze skoroszytu do tablicy, a następnie zamykanie skoroszytu. Podczas pobierania informacji z nowego skoroszytu wzywam Find() 3 razy.

+2

nie może replikować wyniki (XL2013) szukana wartość. Pomiędzy wywołaniem twojego sub-pierwszego i drugiego czasu, używasz Find() do czegokolwiek innego? Byłoby pomocne, gdybyś mógł opublikować dokładne kroki w celu odtworzenia tego, co widzisz (np. - jakie zakresy scalono i jak wiele itd.). –

+2

Nie mogłem tego odtworzyć. Ale uwaga dodatkowa dla każdego, kto bada: Nie dodawaj zegarka dla "Komórek" w VBE, aby sprawdzić, czy ma jakieś nieoczekiwane właściwości.Wydaje się, że przekonuje to VBE, że musi pobrać i przechować wartości każdej komórki w arkuszu (lub coś podobnego). Po prostu udało mi się zablokować komputer, wykorzystując 100% wykorzystanie pamięci ... – Mikegrann

+0

Połączone zakresy mają szerokość (A: R) i wysokość (2). W powyższym podsiecie mam wywołanie innego subwołu tuż przed pętlą, która otwiera skoroszyt pobiera dane z niego do tablicy pullDataPckg, a następnie zamyka skoroszyt. Podczas pobierania danych ze skoroszytu używam funkcji Znajdź(). – wallabe

Odpowiedz

1

Wszystkie ustawienia Find() są trwałe między połączeniami (tak jak podczas wyszukiwania za pośrednictwem interfejsu użytkownika).

Jeśli inne użycie parametru Find spowoduje zmianę parametrów innych niż What, należy upewnić się, że zostały one jawnie zresetowane w kolejnych połączeniach.

W ogóle to zawsze najlepiej jawnie zawierać wszystkie argumenty Find które mogłyby wpłynąć za pomocą prostego sub i jeden obszar scalony zawierający wyniki (takie jak LookAt, LookIn etc)