piątek, 8 maja 2015

Autoincrement - pole automatycznie zliczające.

Jak to zrobić w Accesie/ACE SQL? Nie wiem... W Excelu odpowiedź znalazłem np. tutaj: http://www.4gaccounts.com/5-ways-to-increment-the-cell-values-in-excel/ 

Funkcja
=IF (B3=””,””, COUNTA ($A$2:A2) +1-COUNTBLANK ($A$2:A2)) albo =IF(B3=””,””,COUNTA($B$3:B3)) albo
=IF(C4=”name”, COUNTA($B$2:B3)+1-COUNTBLANK($B$2:B3),””) etc...

Co jednak, gdy kolumnę zliczającą chcę mieć w Excelu w tabeli, której wszystkie rzędy podczas uaktualniania z zapytania ACE SQL są za każdym razem usuwane przez VBA?

Jeśli jest to tabela (ListObject Table), okazuje się, że wystarczy wkleić makrem formułę do pierwszej komórki kolumny L.p. a reszta komórek w kolumnie zostanie automatycznie wypełniona formułą:

'Add autoincrement to first column
Worksheets("Oferta").Range("A7").Formula = "=IF(B7="""","""",COUNTA($B$7:B7))" 
Może to nie jest najlepsze rozwiązanie, ale działa. Muszę poczytać więcej o: - podzapytaniach, które pozwoliłyby na wykonanie autonumeracji w SQL, - odnoszeniach się do elementów tabeli raczej (ListObject table) niż do adresów komórek. Re1: do przeczytania: ACC2000: How to Rank Records Within a Query https://support.microsoft.com/pl-pl/kb/208946 do przestudiowania, przykład od Pana Jacka Zajadacza, autonumerowanie grup, tutaj płci:
SELECT p1.ID, p1.[Nazwisko], p1.[Imie], p1.plec, count(*) as NUMER
FROM Pracownicy AS p1 INNER JOIN Pracownicy AS p2 
ON p1.ID > p2.ID and p1.plec= p2.plec
GROUP BY p1.ID, p1.[Nazwisko], p1.[Imie], p1.plec
ORDER BY p1.plec
Re2: np.
'thanks http://stackoverflow.com/questions/18811431/refer-to-excel-cell-in-table-by-header-name-and-row-number-vba
Worksheets("Oferta").ListObjects("Table3").DataBodyRange.Cells(1, ActiveSheet.ListObjects("Table3").ListColumns("Lp").Index).Formula = "=IF(B7="""","""",COUNTA($B$7:B7))"

'or more readable

Dim tb As ListObject
'assumes Table is the first one on the ActiveSheet
Set tb = Worksheets("Oferta").ListObjects("Table3") ' or less precisely ActiveSheet.ListObjects(1)
    tb.DataBodyRange.Cells(1, tb.ListColumns("Lp").Index.Formula = "=IF(B7="""","""",COUNTA($B$7:B7))"

EDIT:

Ostatecznie pojawiła się nowa potrzeba:  Muszę policzyć tak, by licznik resetował się, zaczynał od nowa,  gdy rozpocznie się nowa grupa:


=IF(G2<>"";COUNTIF($G$2:G2;G2);"")

Brak komentarzy:

Prześlij komentarz