[VBA][C++] For Each Cell w C++

mateuszl95
Użytkownik
Użytkownik
Posty: 97
Rejestracja: 14 paź 2009, o 20:11
Płeć: Mężczyzna
Lokalizacja: Kruszwica
Podziękował: 17 razy
Pomógł: 8 razy

[VBA][C++] For Each Cell w C++

Post autor: mateuszl95 »

Czy istnieje funkcja w języku C/C++, która odpowiadałaby funkcji For Each Cell In obszar z języka VBA.
Albo:
Jak zrealizować następującą funkcję z VBA dla Excela:

Kod: Zaznacz cały

For Each Cell In Range(Cells(a,b),Cells(c,d))
...
Next
w C++?

Przy czym:

Kod: Zaznacz cały

Cells(a,b)=tab[a][b]
Pytam dlatego, że w Excelu program ma nieco długi czas oczekiwania, z czego najdłuższym jest (jak sądzę) uzupełnianie komórek arkusza na podstawie wyjścia algorytmów VBA i gdybym "przepisał" dane z arkusza do tablicy dwuwymiarowej w C++, a kod VBA zamienił na C++, to z pewnością rozwiązanie problemu byłoby duuużo szybsze.
P.S. Danych z arkusza Excel jest mniej niż 100, dlatego nie ma strachu o rozmiar tablicy
Ostatnio zmieniony 28 paź 2014, o 20:26 przez Afish, łącznie zmieniany 1 raz.
Powód: Staraj się lepiej dobierać nazwy tematów, tak by wskazywały o czym jest treść zadania.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[VBA][C++] For Each Cell w C++

Post autor: Afish »

Dwie pętle po jednej na każdy wymiar.
OShon
Użytkownik
Użytkownik
Posty: 65
Rejestracja: 4 mar 2014, o 00:32
Płeć: Mężczyzna
Lokalizacja: VBATools | Kraków | Poland | Europe | Earth | SolSystem | SomewareInSpace
Podziękował: 1 raz
Pomógł: 7 razy

[VBA][C++] For Each Cell w C++

Post autor: OShon »

Ale tu niema 2ch wymiarów.
Zakres ma początek Cells(a,b) i koniec Cells(c,d)
gdzie a i c to wiersz, a b i d to kolumna
Czyli dla każdej komórki w zakresie: Range(Cells(a,b),Cells(c,d))

Oczywiście dobrze by było aby przypisać do zmiennej obiektowej zakres, jak i określić zamienną dla dalej, analizowanej komórki.

Co do prędkości to pojęcie względne, bo oczywiście kompilator .Net jest szybsze niż VBA, ale dla 100 elementów to bez różnicy.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[VBA][C++] For Each Cell w C++

Post autor: Afish »

Jeżeli masz kilka wierszy i kilka kolumn, to są dwa wymiary. Nie bez powodu indeksujesz przy użyciu dwóch liczb, a nie jednej.
OShon
Użytkownik
Użytkownik
Posty: 65
Rejestracja: 4 mar 2014, o 00:32
Płeć: Mężczyzna
Lokalizacja: VBATools | Kraków | Poland | Europe | Earth | SolSystem | SomewareInSpace
Podziękował: 1 raz
Pomógł: 7 razy

[VBA][C++] For Each Cell w C++

Post autor: OShon »

Nie w tym przypadku.
Afish, tak by było gdyby stosować pętle ForNext a nie ForEach
W tym przypadku obszar analizuje każdą komórkę.
Może zmyliło cię to ze kolega mateuszl95 zastosował liczby w określeniu adresu komórki a nie sting.

Ciach
Ostatnio zmieniony 3 lis 2014, o 13:48 przez Afish, łącznie zmieniany 1 raz.
Powód: Reklama.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[VBA][C++] For Each Cell w C++

Post autor: Afish »

Spoko, może w VBA tak jest. W C++ jak masz tablicę dwuwymiarową (a taka jest podana we fragmencie kodu z pierwszego postu), to indeksujesz dwoma wymiarami, więc intuicyjne jest użycie dwóch pętli. Jeżeli twierdzisz inaczej, to zaprezentuj kod, coby przestać rozmawiać ogólnikami.
OShon
Użytkownik
Użytkownik
Posty: 65
Rejestracja: 4 mar 2014, o 00:32
Płeć: Mężczyzna
Lokalizacja: VBATools | Kraków | Poland | Europe | Earth | SolSystem | SomewareInSpace
Podziękował: 1 raz
Pomógł: 7 razy

[VBA][C++] For Each Cell w C++

Post autor: OShon »

Obszar Range posiadać może jedną komórkę lub zakres.

Dla jednej komórki w notacji adresu:

Kod: Zaznacz cały

Range("a1")
to samo mozna przekazać z notacji komórki (zapis jak wektor):

Kod: Zaznacz cały

Range(Cells(1,1))
Dla zakresu:

Kod: Zaznacz cały

Range("a1:b4")
notacja wektorowa:

Kod: Zaznacz cały

Range(Cells(1,1),Cells(2,4))
A wiec zapis Range(Cells(a,b),Cells(c,d)) to nic innego jak zakres Range od-do czyli jak wyżej.
To też pętla "dla każdej komórki" ForEach to:

Kod: Zaznacz cały

dim a&,b&,c&,d&,el as range
a = 1: b = 1: c = 2: d = 4 'podaje podobne wartości aby Afish skumał
dim r as range: set r = Range(Cells(a,b),Cells(c,d))
for each el in r
   debug.print el.value 'podaje wartość każdej komórki w zakresie "a1:b4" w immediate [Ctrl+g]
next r
p.s.
notacja Cells(a,b)=tab[a] nie pochodzi z VBA. Nie da się przypisać tablicy do adresu komórki , zwłaszcza ze tablica w VBA to:

Kod: Zaznacz cały

dim tabl() as variant
      tabl() = range("a1:b4")
      'można sprawdzić wartość tablicy w tym miejscu tabl(a,b) 
debug.print tabl(1,2)
a zwrot tablicy do zakresu musi przewidzieć max zakres i wypełnia on komórki począwszy od zadeklarowanego adresu:

Kod: Zaznacz cały

Range("a1").Resize(UBound(tabl), 2) = tabl
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[VBA][C++] For Each Cell w C++

Post autor: Afish »

Spoko, ale tutaj nikt nie pyta o VBA. Jak autor sam zaznaczył, zna sposób rozwiązania problemu w VBA, ale szuka odpowiednika w C++ i o kod w tym języku chodzi.
ODPOWIEDZ