Pagina 1 di 1

[Risolto] Conflitto macro

Inviato: domenica 18 settembre 2022, 22:56
da Arbellini
Salve a tutti,
stavo cercando di continuare ad esercitarmi con le macro ma purtroppo sono rimasto nuovamente impigliato :)
La mia intenzione era quella di aggiungere una macro ad una tabella di inserimento dati.
La macro della Tabella di inserimento dati è perfettamente funzionante, ma dopo averne aggiunto un'altra non funziona più.
Anche la seconda macro che ho aggiunto funziona.

In pratica la prima macro:

Codice: Seleziona tutto

sub copia
Doc = ThisComponent
Sheet = Doc.Sheets.getByName("data_entry")
Sheet1 = Doc.Sheets.getByName("Inserimento_dati")
mode = Sheet.getCellRangeByName("C4").string
allert = Sheet.getCellRangeByName("N4").string

Range0 = Sheet.getCellRangeByName("F6")
Range1 = Sheet.getCellRangeByName("F8")
Range2 = Sheet.getCellRangeByName("J8")
Range3 = Sheet.getCellRangeByName("F10")
Range4 = Sheet.getCellRangeByName("J10")
Range5 = Sheet.getCellRangeByName("F12")


ranges = Array(range0,range1, range2, range3, range4, range5)
for i = 0 to 5
    If ranges(i).string="" then
       Doc.CurrentController.Select(ranges(i))
      'ranges(i).CellBackColor = qbcolor(9)
       msgbox "CAMPO VUOTO " & rangeTextAddress(ranges(i),Sheet)
       exit sub
     'Else
      'ranges(i).CellBackColor = RGB(240,255,240)
    end if
next i
      
c = Sheet1.createCursor
c.gotoEndOfUsedArea(false)
LastRow = c.RangeAddress.EndRow + 2

    If mode = "RECORD" And Sheet.getCellRangeByName("N4").string = "" then
       Sheet.getCellRangeByName("T35:AJ35").setDataArray(Sheet.getCellRangeByName("T33:AJ33").getDataArray)
       Range = Sheet.getCellRangeByName("T35:AJ35").getRangeAddress()
       CellAddress = Sheet1.getCellRangeByName("C" & Lastrow).CellAddress
       Sheet.copyRange(CellAddress, Range)
       
      Else
        msgbox allert
        
       'oppure per aumentare condizioni usare al posto di Else 
       'Elseif  ... = "..." And ....... = "..." then    
                    
    End if
    
'Sheet.getCellRangeByName("F6:F16").ClearContents(7)
'Sheet.getCellRangeByName("J8:J16").ClearContents(7)
'Sheet.getCellRangeByName("F22:F22").ClearContents(7)
          
End Sub

Sub Campo_data(oEv)
Dim oCell As Object
oCell = thisComponent.Sheets.getByName("data_entry").getCellRangeByname(oEv.Source.Model.Name)
oCell.FormulaLocal = oEv.Source.getText()
End Sub

Function rangeTextAddress(rng as object, SH as object) as string
Dim Doc As Object, Sheet As Object, CellRange As Object
RngAddr=Rng.getRangeAddress
RngColumn=Rng.Columns
FirstCol=RngColumn.getByIndex(0).getName
FirstRow=RngAddr.StartRow+1
FCol=RngAddr.StartColumn-2
FRow=RngAddr.StartRow
'rangeTextAddress = FirstCol + FirstRow + " (" + sh.GetCellbyPosition(FCol,FRow).String + + ")"
rangeTextAddress = sh.GetCellbyPosition(FCol,FRow).String
End Function
ho fatto alcune modifiche e funziona alla perfezione

poi però essendo una tabella con funzione di inserimento e ricerca dati (successivamente anche di modifica) ho aggiunto quest'altra, associata a evento foglio contenuto modificato:

Codice: Seleziona tutto

Sub RicercaEmodifica

Dim Doc As Object, Sh As Object
Dim LastRow As Long
Doc = ThisComponent
Sh = Doc.Sheets.getByName("data_entry")
mode1 = Sh.getCellRangeByName("C4").string
allert1 = Sh.getCellRangeByName("N6").string

   If mode1 = "RICERCA E MODIFICA" <> "" then
 
     Sh.getCellByPosition(5,  5).String = Sh.getCellRangeByName("U44").String 
     Sh.getCellByPosition(5,  7).String = Sh.getCellRangeByName("V44").String 
     Sh.getCellByPosition(9,  7).String = Sh.getCellRangeByName("X44").String 
     Sh.getCellByPosition(5,  9).String = Sh.getCellRangeByName("Y44").String 
     Sh.getCellByPosition(9,  9).String = Sh.getCellRangeByName("AA44").String
     Sh.getCellByPosition(5, 11).String = Sh.getCellRangeByName("AB44").String
     Sh.getCellByPosition(9, 11).String = Sh.getCellRangeByName("AC44").String
     Sh.getCellByPosition(5, 13).String = Sh.getCellRangeByName("AD44").String
     Sh.getCellByPosition(9, 13).String = Sh.getCellRangeByName("AE44").String
     Sh.getCellByPosition(5, 15).String = Sh.getCellRangeByName("AF44").String
     Sh.getCellByPosition(9, 15).String = Sh.getCellRangeByName("AG44").String
              
      Else 
       'msgbox allert1        
       Exit Sub       
                    
   End if
   
End Sub
... adesso funziona solo la seconda, sarà dovuto a Exit sub o magari all'evento foglio - contenuto modificato.

Mi dareste una mano a capire?

Allego file

Re: Conflitto macro

Inviato: domenica 18 settembre 2022, 23:17
da Arbellini
La tabella dovrebbe funzionare in questo modo:
Nella cella C4 c'è un menù a discesa che seleziona le modalità di Inserimento (RECORD) e di RICERCA E MODIFICA.
I dati si riferiscono al foglio Inserimento_dati.
I range che permettono, attraverso delle formule, l'inserimento e la ricerca dei dati sono rispettivamente "dara_entry" T33:AJ33 e "data_entry"T44:AJ44.
Se in modalità RECORD inserisco i dati, altrimenti se in modalità RICERCA E MODIFICA si effettua , per il momento, solo la ricerca.

Se non sono stato chiaro , fatemi sapere.

Buona notte
:|

Re: Conflitto macro

Inviato: lunedì 19 settembre 2022, 11:20
da patel
Capito niente. La sub RicercaEmodifica si limita a copiare alcune celle su altre celle, perché associarla all'evento contenuto modificato ?
Inoltre non hai indicato quale cella, se modificata deve far scattare l'evento.

Re: Conflitto macro

Inviato: lunedì 19 settembre 2022, 11:54
da Arbellini
patel ha scritto: lunedì 19 settembre 2022, 11:20 Capito niente. La sub RicercaEmodifica si limita a copiare alcune celle su altre celle, perché associarla all'evento contenuto modificato ?
Proverò ad associarla ad un pulsante,
mi piaceva l'idea di attivarla in automatico una volta selezionato il menù a discesa.
Uno dei problemi riguarda la cella che scatena l'evento, potrebbe essere qualsiasi,
l'importante che mi permetta di far funzionare tutte e due le macro :)
L'idea del lavoro in generale è quella di creare una tabella con le stesse funzionalità di un formulario:
Le funzioni sono tre:
Inserisco i dati,
ricerco e modifico.
A me serve capire quale sia la strada migliore

Re: Conflitto macro

Inviato: lunedì 19 settembre 2022, 12:07
da patel
Arbellini ha scritto: lunedì 19 settembre 2022, 11:54 mi piaceva l'idea di attivarla in automatico una volta selezionato il menù a discesa.
questo non l'avevi detto, come l'hai scritta tu si attiva quando modifichi qualunque cella, riprendi le precedenti discussioni, hai degli esempi già fatti.

Re: Conflitto macro

Inviato: lunedì 19 settembre 2022, 12:19
da patel
Inoltre non capisco la riga
Sh.getCellByPosition(5, 5).String = Sh.getCellRangeByName("U44").String

in F6 hai un menù a discesa, perché ci copi sopra qualcosa ?

Re: Conflitto macro

Inviato: lunedì 19 settembre 2022, 12:54
da Arbellini
patel ha scritto: lunedì 19 settembre 2022, 12:19 Inoltre non capisco la riga
Sh.getCellByPosition(5, 5).String = Sh.getCellRangeByName("U44").String

in F6 hai un menù a discesa, perché ci copi sopra qualcosa ?
È vero,
In F6 ho inserito un menù a discesa per fare delle prove
questa riga: Sh.getCellByPosition(5, 5).String = Sh.getCellRangeByName("U44").String, è INUTILE.

Re: Conflitto macro

Inviato: lunedì 19 settembre 2022, 13:55
da Arbellini
Un'altro problema è quello di non riuscire a modificare le celle, in quanto l'evento attiva nuovamente la copia.
Devo capire le condizioni giuste da impostare :crazy:

Re: Conflitto macro

Inviato: lunedì 19 settembre 2022, 18:44
da patel
Io non ho capito il tuo obiettivo, ma mi sembra sbagliato concettualmente abbinare la modifica con la ricerca

Re: Conflitto macro

Inviato: lunedì 19 settembre 2022, 19:33
da Arbellini
Questa macro risolve il mio problema, ma al 75% :D

Codice: Seleziona tutto

Sub RicercaEmodifica

Dim Doc As Object, Sh As Object
Doc = ThisComponent
Sh = Doc.Sheets.getByName("data_entry")
mode1 = Sh.getCellRangeByName("C4").string
allert1 = Sh.getCellRangeByName("N6").string
 
   If mode1 = "RICERCA" then
        
     Sh.getCellByPosition(5,  7).String = Sh.getCellRangeByName("V44").String 
     Sh.getCellByPosition(9,  7).String = Sh.getCellRangeByName("X44").String 
     Sh.getCellByPosition(5,  9).String = Sh.getCellRangeByName("Y44").String 
     Sh.getCellByPosition(9,  9).String = Sh.getCellRangeByName("AA44").String
     Sh.getCellByPosition(5, 11).String = Sh.getCellRangeByName("AB44").String
     Sh.getCellByPosition(9, 11).String = Sh.getCellRangeByName("AC44").String
     Sh.getCellByPosition(5, 13).String = Sh.getCellRangeByName("AD44").String
     Sh.getCellByPosition(9, 13).String = Sh.getCellRangeByName("AE44").String
     Sh.getCellByPosition(5, 15).String = Sh.getCellRangeByName("AF44").String
     Sh.getCellByPosition(9, 15).String = Sh.getCellRangeByName("AG44").String
     
    Else  
     'msgbox allert1  
   Exit Sub     
                                 
   End if
    
   
End Sub
In questo modo se seleziono RICERCA esegue la ricerca, altrimenti esce, permettendomi di modificare i campi nel caso selezioni MODIFICA
L'unico problema adesso è che se decido invece, di inserire un nuovo dato nella modalità "RECORD" mi ritrovo tutte i campi pieni, mentre io li vorrei vuoti, visto che devo inserire nuovi dati (vorrei i campi vuotii solo se seleziono RECORD)

Re: Conflitto macro

Inviato: lunedì 19 settembre 2022, 19:45
da Arbellini
patel ha scritto: lunedì 19 settembre 2022, 18:44 Io non ho capito il tuo obiettivo, ma mi sembra sbagliato concettualmente abbinare la modifica con la ricerca
La ricerca mi serve per estrarre i dati di un nominativo per poterli modificare.
La mia idea era:
Il Nominativo A parte in vacanza oggi
Quindi lo inserisco (RECORD)
Quando so che è arrivato a destinazione vado prima ricercare il Nominativo A (RICERCA), poi aggiungo la data e la destinazione di arrivo (MODIFICA).
Infine AGGIORNO (macro ancora da fare).

Allego nuovo file, in quanto ho modificato il menù a discesa in:
RECORD
RICERCA
MODIFICA

Prima RICERCA E MODIFICA erano assieme :D

Re: Conflitto macro

Inviato: lunedì 19 settembre 2022, 21:03
da patel
Continuo a non capire il tuo ragionamento e l'utilità del contenuto modificato.

Re: Conflitto macro

Inviato: lunedì 19 settembre 2022, 21:22
da Arbellini
Dici che dovrei abbandonarlo?
Di sicuro non avrei questi problemi :D
A questo punto però, visto che ci ho perso tutto ieri e oggi, sarei interessato ad una eventuale soluzione, se c'è.
Per questa sera chiudo.

Buona serata

Re: Conflitto macro

Inviato: martedì 20 settembre 2022, 7:26
da patel
Io terminerei il progetto con soli pulsanti, poi eventualmente proverei a fare una versione col contenuto modificato, ma devi avere le idee ben chiare su quale cella utilizzarlo.
Considera che anche la copia di celle su altre modifica il contenuto, quindi rischi di innescare un loop infinito.

Re: Conflitto macro

Inviato: martedì 20 settembre 2022, 10:08
da Gaetanopr
La macro che si avvia con il contenuto modificato prevede solo la scelta RICERCA, ad ogni modo io farei tutto diversamente, per funzionare un buon formulario(credi tu voglia creare qualcosa del genere) necessita di una pianificazione come la seguente.
1) Tabella dove visualizzare i record tramite dei pulsanti per farli scorrere
2) Possibilità di nuovi inserimenti, modifiche e cancellazioni.
Queste sono le cose basilari, operazioni abbastanza elementari se si utilizza un database, Base in OpenOffice, anche con Calc è possibile farlo ma occorre molto più lavoro.
Ti allego un file dove ho sfruttato 1 primi 4 campi della tua tabella, ho definito un nome "ELENCO" con la lista dei nominativi con tutti i dati, aggiunto dei pulsanti di selezione collegati alla cella A1, ad ogni pressione viene visualizzato un record che corrisponde all'indice della cella A1.
L'esempio è banale per capire il funzionamento, tutto questo andrebbe fatto con macro e senza formule.
Quindi ti occorrono i pulsanti per visualizzare i record, un pulsante "Nuovo" che pulisce tutti i campi in modo da effettuare nuovi inserimenti e u pulsante Aggiungi, un pulsante Modifica per modificare il record visualizzato, un pulsante Elimina per ripulire i campi e cancellare la riga che contiene il record corrente.
Sembra difficile ma è molto semplice, c'è solo da scrivere scrivere e scrivere codice.
Pure Calc offre la possibilità di creare un formulario selezionando l'area contenenti i dati, andando su Dati e Formulario si aprirà un formulario che ti permetterà di effettuare le operazioni che ti ho descritto.

Re: Conflitto macro

Inviato: martedì 20 settembre 2022, 13:26
da Arbellini
Gaetanopr ha scritto: martedì 20 settembre 2022, 10:08 La macro che si avvia con il contenuto modificato prevede solo la scelta RICERCA, ad ogni modo io farei tutto diversamente, per funzionare un buon formulario(credi tu voglia creare qualcosa del genere) necessita di una pianificazione come la seguente.
1) Tabella dove visualizzare i record tramite dei pulsanti per farli scorrere
2) Possibilità di nuovi inserimenti, modifiche e cancellazioni.
Queste sono le cose basilari, operazioni abbastanza elementari se si utilizza un database, Base in OpenOffice, anche con Calc è possibile farlo ma occorre molto più lavoro.
Ti allego un file dove ho sfruttato 1 primi 4 campi della tua tabella, ho definito un nome "ELENCO" con la lista dei nominativi con tutti i dati, aggiunto dei pulsanti di selezione collegati alla cella A1, ad ogni pressione viene visualizzato un record che corrisponde all'indice della cella A1.
L'esempio è banale per capire il funzionamento, tutto questo andrebbe fatto con macro e senza formule.
Quindi ti occorrono i pulsanti per visualizzare i record, un pulsante "Nuovo" che pulisce tutti i campi in modo da effettuare nuovi inserimenti e u pulsante Aggiungi, un pulsante Modifica per modificare il record visualizzato, un pulsante Elimina per ripulire i campi e cancellare la riga che contiene il record corrente.
Sembra difficile ma è molto semplice, c'è solo da scrivere scrivere e scrivere codice.
Pure Calc offre la possibilità di creare un formulario selezionando l'area contenenti i dati, andando su Dati e Formulario si aprirà un formulario che ti permetterà di effettuare le operazioni che ti ho descritto.
Per il momento preferisco utilizzare le formule, anche perchè mi sono appena avvicinato al mondo delle macro.
Proverò ad associare le macro a dei pulsanti.
Grazie per i consigli.

Re: Conflitto macro

Inviato: martedì 20 settembre 2022, 16:33
da Gaetanopr
Arbellini ha scritto: martedì 20 settembre 2022, 13:26 Per il momento preferisco utilizzare le formule.........Proverò ad associare le macro a dei pulsanti...
Non capisco il tuo ragionamento, chiedi aiuto con un post titolato macro, dici che vuoi associare le macro ai pulsanti e poi dici che preferisci usare le formule!!!!!! :? :?
Il mio consiglio era proprio questo, usare i pulsanti per le operazioni di inserimento modifica ed eliminazione record.
Gaetanopr ha scritto: martedì 20 settembre 2022, 10:08 Quindi ti occorrono i pulsanti per visualizzare i record, un pulsante "Nuovo" che pulisce tutti i campi in modo da effettuare nuovi inserimenti e u pulsante Aggiungi, un pulsante Modifica per modificare il record visualizzato, un pulsante Elimina per ripulire i campi e cancellare la riga che contiene il record corrente.
Sembra difficile ma è molto semplice

Re: Conflitto macro

Inviato: martedì 20 settembre 2022, 19:24
da Arbellini
Si, lo so infatti il rischio era quello di essere frainteso.
Non ho bisogno di un formulario.
La mia necessità era quella di capire se era corretto l'utilizzo di una macro associata all'evento foglio - contenuto modificato (C4).
L'associazione dei pulsanti l'avevo prevista, ma volevo trovare un'alternativa in quanto non mi soddisfa il fatto di dover cancellare tutte le volte che cambio modalità (ad es. da Modifica a Inserimento), infatti mi sarebbe piaciuto che una volta scelta la modalità "Inserimento" mi sarei trovato in automatico tutti i campi vuoti senza doverli cancellare manualmente, tramite un pulsante
La richiesta è scaturita anche dal fatto che tutte le soluzioni dei post che si riferiscono a tale argomento (spesso formulari), hanno lo stesso problema (me ne farò una ragione).
Riguardo alle formule, forse dovuto al fatto di avere poca conoscenza delle macro "senza forse", resto molto legato, in questo modo però riesco a gestire meglio eventuali problemi, poi magari se sono in grado di farlo associo delle semplici macro.
Quello che mi sarebbe piaciuto erano degli esempi, al momento ho bisogno di esempi, non cerco lavori fatti.
Lo so che mi devo esercitare, ma lo so perché lo penso già io.
Sono passati ormai tre giorni per capire che dovevo aggiungere un pulsante che pulisce, ma che dall'inizio non avrei voluto.
La mia richiesta non era su come dovevo fare la ricerca o trovare l'indice, certo ... fatto con le macro e tutt'altra cosa, ma al momento non è un mio problema, quello che posso lo risolvo da solo.
Vi chiedo solo di non fraintendermi.

Buona serata e buona vita :D

Allego file

Re: [Risolto] Conflitto macro

Inviato: mercoledì 21 settembre 2022, 7:06
da Arbellini
La mia "partecipazione" termina qui.
Buona continuazione

Re: [Risolto] Conflitto macro

Inviato: mercoledì 21 settembre 2022, 9:23
da patel
Non capisco il senso di "Buona continuazione", senza di te a che serve continuare ? inoltre hai già messo il Risolto.