Identificarea ultimei linii

tyro_excel_vba
Mesaje: 27
Membru din: Joi Oct 18, 2018 3:07 pm

Identificarea ultimei linii

Mesaj de tyro_excel_vba » Joi Oct 17, 2019 2:22 pm

Buna,

Am un fisier ce contine informatii pe care le adauga terte parti si care imi sunt necesare pentru a construi alte rapoarte, acest fisier este actualizat zilnic.
Exista vreo metoda de a automatiza actualizarea datelor in rapoartele mele? de ex cand cineva adauga o linie noua in tabelul sursa, cand deschid rapoartele mele, sa fie deschisa si sursa si sa fie preluate de acolo doar liniile noi.

Cum pot identifica ultima informatie adaugata in raportul meu si apoi sa identific si in sursa urmatoarele linii completate dupa aceasta ca sa le aduc in raportul meu doar pe cele noi?

Atasez si un model de fisier, in sheet 1 am sursa, iar in sheet 2 am unul dintre rapoarte in care vreau sa adaug comentarii si am si alte coloane

Multumesc
Nu aveţi permisiunea de a vizualiza fişierele ataşate acestui mesaj.

IPP
Moderator
Moderator
Mesaje: 4196
Membru din: Mie Iul 29, 2009 7:26 am
Localitate: Cluj-Napoca

Re: Identificarea ultimei linii

Mesaj de IPP » Dum Oct 20, 2019 5:22 pm

Buna ziua

Din punctul meu de vedere:
-nu aveti nici un identificator unic care sa permita o comparatie rapida astfel incat sa fie clar care este /va fi inregistrarea noua. Pentru ca nu va puteti baza pe faptul ca ultimul rand de la sursa este/va fi si cel mai nou sau chiar ordinea randurilor va fi intotdeauna identica la sursa respectiv la dvs. (ma gandesc si in acel raport se vor face sortari la un moment dat). E suficient ca la sursa, de exemplu sa se faca o sortare care sa duca la o aranjare diferita a informatiei.

-cel putin teoretic, daca ati rezolva problema Id-urilor unice pentru fiecare inregistrare, actualizarea aceea se poate face printr-un cod macro.

-exista, tot cel putin teoretic, varianta folosirii, in loc de macro a unei solutii bazate pe power query pentru a aduce informatia actualizata de la sursa dar si aici depinde de ce veti face mai departe.

Fara un identificator unic la nivel de intregistrare (=rand cu informatie), pentru orice varianta ati opta exista niste riscuri / complicatii potentiale.

IP

tyro_excel_vba
Mesaje: 27
Membru din: Joi Oct 18, 2018 3:07 pm

Re: Identificarea ultimei linii

Mesaj de tyro_excel_vba » Lun Oct 21, 2019 1:11 pm

Buna,

Am reusit sa scriu un cod care pare ca functioneaza cu conditia ca sursa sa nu fie sortata a i ordinea liniilor sa fie data peste cap.
Cum am gandit-o: cand se deschide fisierul de sinteza va rula automat codul si va deschide fisierul sursa de unde va copia toate datele si mi le va lipi intr-un sheet nou denumit "source", apoi va verifica daca valoarile din coloanele D si F din ultima linie din sursa sunt aceleasi cu cele din sinteza si daca da, va da un mesaj prin care va informa ca nu sunt linii noi, daca nu sunt identice datele va cauta in sursa informatia din coloana D si apoi cand valorile din D si F sunt egale cu cele din sinteza, va selecta de la urmatoarea linie pana la ultima completata, va copia si apoi va lipi in prima linie disponibila din sinteza.
Acesta este codul, am testat si functioneaza, acum tre sa ma mai gandesc cum pot "stabiliza" informatiile din sursa, pentru a ma asigura ca aduc in sinteze datele corecte

Sub updateRts()

Dim lastRow, eRow As Long
Dim othlastrow As Long
Dim whattosearch As String
Dim secondcond As String

lastRow = Sheets("RTS").Range("D" & Rows.Count).End(xlUp).Row
othlastrow = Sheets("source").Range("D" & Rows.Count).End(xlUp).Row
whattosearch = Sheets("RTS").Range("D" & lastRow).Value
secondcond = Sheets("RTS").Range("F" & lastRow).Value

If Sheets("RTS").Range("D" & lastRow).Value = Sheets("source").Range("D" & othlastrow).Value And Sheets("RTS").Range("F" & lastRow).Value = Sheets("source").Range("F" & othlastrow).Value Then

MsgBox "no new lines", vbInformation

Else

Sheets("source").Activate

Cells.Find(What:=whattosearch, After:=ActiveCell _
, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _
SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate

If ActiveCell.Value = whattosearch And _
Range("F" & ActiveCell.Row).Value = "" Then

Range("D" & ActiveCell.Row + 1).Select

If ActiveCell.Value = whattosearch And _
Range("F" & ActiveCell.Row).Value = secondcond Then

Sheets("source").Range("A" & ActiveCell.Row + 1).Select

eRow = Range("D" & Rows.Count).End(xlUp).Row
Range(ActiveCell, "W" & eRow).Copy


End If

End If

End If

Sheets("RTS").Activate

Range("A" & lastRow + 1).Select

ActiveCell.PasteSpecial


End Sub

Scrie răspuns

Înapoi la “Visual Basic for Application (VBA) cu Excel - Intrebari tehnice”