Do While VBA Code

djidji_thebest
Mesaje: 41
Membru din: Mie Sep 15, 2010 2:28 pm

Do While VBA Code

Mesaj de djidji_thebest » Mar Dec 15, 2020 11:08 pm

Salutare,

Doresc sa creez o procedura de consolidare automata.
Ma poate ajuta cineva cu o instructiune de genul Do While pentru urmatoarea speta:

Atat timp cat in range-ul C12 - C23 si E14 - E23 exista sintagma "Please_Consolidate", sa ruleze 2 actiuni de consolidare pe coloanele B12 - B23 si D14 - D23, pe fiecare celula in parte.

Logica este urmatoarea: rularea se va face in ordine:
  • se ia prima celula C12 si se verifica daca este "Please_Consolidate".
    Daca da, atunci trebuie activata celula B12 si se vor rula doua proceduri de tip "Call"

    Cod: Selectaţi tot

    Call ConsolidateMacro
    si

    Cod: Selectaţi tot

    Call RefreshMacro
    ambele fiind definite intr-un alt modul.
    Daca nu, atunci se trece la celula urmatoare: C13.
    • dupa ce precedentele doua proceduri sunt finalizate, se verifica urmatoarea celula C13 pentru a vedea daca e "Please_Consolidate".
      Daca da, atunci se vor rula din nou cele doua proceduri "Call" pentru celula B12.
      Daca nu, atunci se trece la celula urmatoare: C14 si tot asa.
    Am impresia ca o procedura de genul Do While se potriveste in cazul acesta. Daca nu, poate aveti o alta metoda mai usoara. Altfel, IF va functiona intotdeauna ca o varianta de compromis.

    Multumesc mult!
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: Do While VBA Code

Mesaj de IPP » Joi Dec 17, 2020 9:03 am

Buna ziua

Este posibil sa aveti nevoie de un cod de genul:

Cod: Selectaţi tot

For Each c In Sheets("AutoConsolidation").Range("C12:C23")
 If c.Value = "Please_Consolidate" Then
   Call ConsolidateMacro
   Call RefreshMacro
 End If
Next c
Insa depinde cum arata si cum sunt gandite celelalte coduri macro. Daca ele calculeaza deja un rezultat ce urmeaza a fi afisat, sa spunem in B12 (daca in C12 exista conditia necesara), atunci in codul de mai sus se intercaleaza o instructiune c.offset(0,-1).value =......

Apoi depinde ce intelegeti dvs. prin "consolidare automata". In termeni VBA ar fi vorba despre un "eveniment". De exemplu setarea unui range care, daca sufera o modificare de editare manuala sa declanseze verificarea aceea mai ales ca si acel text-criteriu este rezultatul unei formule (deci daca din diverse motive modul de calcul in foaie va ajunge manual....) si implicit rularea celor doua macro. Care, din nou, nu stim cum sunt facute.

In conditiile date ma cam indoiesc ca se poate da un raspuns/solutie satisfacatoare.

IP

djidji_thebest
Mesaje: 41
Membru din: Mie Sep 15, 2010 2:28 pm

Re: Do While VBA Code

Mesaj de djidji_thebest » Mie Dec 23, 2020 11:22 am

Buna ziua,

Multumesc mult pentru raspuns!
Desi pare mult text mai jos, sunt doar cateva detalii clarificatoare care sper ca raspund incertitudinilor din mesajul dvs.
Codul functioneaza partial, insa e nevoie de detaliile urmatoare:
  • da, celelalte 2 macrouri modifica continutul celule B12 (care va modifica apoi automat continutul celulei C12 din CN in OK. Celelalte coduri macro, nu fac decat sa schimbe celulele din coloana B, din "CN" (ConsolidationNeeded) in "OK", dupa ce proceseaza consolidarea (consolidarea la care ma refer este facuta printr-un add-in legat la un sistem financiar, si prin add-in se acceseaza proprietatile sistemului si se proceseaza in sistem un proces de consolidare - nu are nimic de a face cu evenimentele din termenii VBA);
  • prin urmare cred ca e nevoie de o instructiune intercalata care sa schimbe de fiecare data randul in ideea in care, verifica prima data celula C12, daca e CN, atunci trebuie sa activam celula B12 si sa rulam procesul (ConsolidateMacro), dupa care, rulam al doilea proces (RefreshMacro) dupa care trecem la celula C13; daca celula C13 e "CN", atunci urmam pasii de mai sus, daca e "OK" atunci trecem la celula C14 si tot asa mai departe - practic trebuie sa consolideze (prin activarea celulelor din coloana B) toate randurile care sunt "Please_Consolidate", unul dupa altul
  • procesul "ConsolidateMacro" activeaza o instructiune care consolideaza (in sistemul financiar) celula care este activata; mai jos am pus codul instructiunii

    Cod: Selectaţi tot

    Public Declare PtrSafe Function HypConsolidate Lib "HsAddin" (ByVal vtSheetName As Variant, ByVal vtRange As Variant) As Long
    ' consolidate the active cell
    Public Sub ConsolidateMacro()
    sts = HypConsolidate(Empty, Empty)
    End Sub
    
    daca nu punem nicio celula, si lasam (Empty, Empty) atunci se consolideaza celula activa. Ma gandeam ca e cel mai simplu proces asa, de a aciva celulele din coloana B in functie de coloana C, una cate una (daca considerati mai simpla o alta metoda, cu atat mai bine)
  • doar pentru referinta, cealalta instructiune "RefreshMacro", activeaza o functie a sistemului financiar de a face actualizarea datelor, actualizeaza celulel din coloana B pentru a vedea daca mai e necesara consolidarea dau nu

    Cod: Selectaţi tot

    Public Declare PtrSafe Function HypMenuVRefresh Lib "HsAddin" () As Long
    
    'Refresh current Worksheet
    Sub RefreshMacro()
       x = HypMenuVRefresh()
    End Sub
    
Din cate cred, trebuie o instructiune care sa activeze celula din coloana B (daca celula din coloana C este "Please_Consolidate") si dupa ce o consolideaza, trece si verifica urmatoarea linie.

Cod: Selectaţi tot

For Each c In Sheets("AutoConsolidation").Range("C12:C23")
 If c.Value = "Please_Consolidate" Then
   Range("B12").Activate  <-- probabil ca aici e nevoie de un cod offset
   Call ConsolidateMacro
   Call RefreshMacro
 End If
Next c
Nu aveţi permisiunea de a vizualiza fişierele ataşate acestui mesaj.

Scrie răspuns

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