Newsgroup: it.comp.appl.access
Titolo: equivalente di "trova e sostituisci" su caselle di testo in report

Ciao a tutti, premetto che sono niubbo ma che vi lurko da un bel po'...
questa volta però non riesco a venire a capo di 'sta cosa da solo e
chiedo help!
Dunque, ho un mdb con circa 60 report, ognuno composto da quasi un
migliaio di caselle di testo (ecco cosa succede a ereditare i
lavori...bella porcata...), ognuna con un DCount tipo
=DCount("[Tabella questionario]![10 con chi vive]&[Tabella
questionario]![04 sesso]&[Tabella questionario]![05 nascita]";"[Tabella
questionario]";"[Tabella questionario]![04 sesso]=1 AND [Tabella
questionario]![05 nascita]>=1930 AND [Tabella questionario]![05
nascita]<= 1939 and [Tabella questionario]![10 con chi vive]=1")/335
Ora, visto che la committenza continua a cambiare le cose ogni minuto,
mi trovo a dover sostituire tutti quei "/335" (è la parte della
formula che mi fa ricavare la percentuale) in altri numeri o formule. A
saperlo prima avrei messo una variabile, ma ormai il danno è fatto...
A farlo a mano ci metterei almeno altre due settimane, quindi stavo
studiando come farlo via codice, simulando un trova e sostituisci. Le
caselle di testo sono tutte nominate in automatico, quindi "testoXXXX"
dove XXXX è un numero più o meno consecutivo. Sono riuscito a
ricavare una cosa così:
Private Sub Comando0_Click()
   Dim x As String
   Dim IN As String
   Dim intY As String
   intY = 1
   Do While intY < 100000
   intY = intY + 1
   x = Forms![maschera4]![Testo'"&intY&"'].ControlSource
   miatextbox = x
   IN = Me.miatextbox
   x = Replace(x, ")*(100/335)", ")*(ciao)")
   Forms![maschera4]![Testo'"&intY&"'].ControlSource = x
   Loop
End Sub
I problemi sono i seguenti:
- come si vede ho spostato il lavoro su maschera perchè su report non
funzionava il replace (non posso dare il focus alla singola casella, se
non ho capito male), però è inutile perchè se mi devo mettere a
spostare a mano da report a maschera e viceversa mi salta la
formattazione (pietosa peraltro, ma le caselle sono sovrapposte a delle
tabelle di word, e se si spostano son dolori...)
- se lo faccio lavorare su una singola casella di cui metto il nome a
mano funziona (anche se con i problemi di cui sotto) però se provo a
far diventare l'incrementale (intY) parte della variabile (testoXXXX)
non lo accetta più
- Anche se la sostituzione funziona non appena cambio visualizzazione
(struttura/anteprima) o chiudo me la perde, senza lasciarmi
possibilità di salvarla, anche se è abbastanza inutile perchè come
detto sopra ho necessità che la sostituzione avvenga nei report...
Qualcuno può darmi una dritta su come uscire da questo insabbiamento?
Grazie in anticipo...
ciao a tutti, co


Da quello che ho capito dovresti prelevare (aprire) tutti i reports che 
ti interessano in DesignMode   (quali sono li puoi sapere o dalla 
collezione application.currentproject.allreports o da una select su 
msysobjects con type=-32764) modificare i textboxes e risalvare il report
--
ac

Ti ringrazio moltissimo per la risposta ma... abbi pazienza ma non c'ho
capito niente, è come parlare di equazioni ad uno di seconda
elementare ;-)

 
vai su 
www.sitocomune.com
 Sezione Forms 3.41 dovrebbe essere quello che 
ti interessa. Ovviamente e' da modificare. L'autore saltuariamente fa 
ancora qualche apparizione sul NG, comunque se dovessi avere problemi 
non dovrebbe essere complicato risolverli.
--
ac

dunque grazie alla tua dritta ho fatto un salto di 256 anni luce circa
;-) fantastico!
ho ancora un problemino, ma penso sia proprio solo più una
cretinata... Il codice che ho tirato fuori modificando quello che mi
hai indicato è questo qui:
Sub pulisci_Controlli(obj)
Dim Ctl As Control
Dim strctrl As String
Dim strfind As String
Dim strctrlmod As String
Dim intposizione As Integer
  For Each Ctl In obj.Parent.Controls
    Select Case Ctl.ControlType
      Case Is = acTextBox
           strctrl = Ctl.ControlSource
           strfind = Me.trova
           intposizione = InStr(strctrl, strfind)
           strctrlmod = Left(strctrl, intposizione - 1)
           Ctl.ControlSource = strctrlmod
     End Select
  Next Ctl
End Sub
Il Me.Trova corrisponde ad una casella non associata dove vado a
mettergli il carattere da cercare alla cui destra viene eliminato
tutto. Fino qua funziona tutto. Se però l'ultima riga la vado a
modificare in
Ctl.ControlSource = strctrlmod & Me.Sostituisci
(Dove Me.Sostituisci è una casella non associata dove mettere ciò che
bisogna aggiungere nella casella di testo) o comunque aggiungo qualcosa
tipo
Ctl.ControlSource = strctrlmod & "ciao"
mi da un errore di runtime 2434 con errore di sintassi
nell'espressione. Eppure prima funzionava la stessa sintassi (era quasi
uguale nell'esempio originale...). Dove sbaglio?

 uguale nell'esempio originale...). Dove sbaglio?
L'unica cosa che mi viene in mente e' che *strctrlmod* contenga apici o 
virgolette spaiate e/o virgole non regolamentari.
--
ac

 virgolette spaiate e/o virgole non regolamentari.
ancora una volta la tua dritta mi ha indirizzato verso la soluzione ;-)
Il problema era il testo di prova, "ciao" sballava la formula DCount e
quindi non veniva accettato. Questo significa che viene fatto un
controllo sulla correttezza anche sugli inserimenti non a mano, non
pensavo...
Comunque ora funziona alla perfezione, e io ho risparmiato quel mesetto
di lavoro ripetitivo e da scimmietta ammaestrata... Ti ringrazio
veramente tanto!
Posto il codice finale, dovesse mai servire a qualcuno...
Sub scimmiette_ammaestrate(obj)
Dim Ctl As Control
Dim strctrl As String
Dim strfind As String
Dim strctrlmod As String
Dim intposizione As Integer
  For Each Ctl In obj.Parent.Controls                       'per ogni
oggetto
    Select Case Ctl.ControlType
      Case Is = acTextBox                                   'che sia
casella di testo
           strctrl = Ctl.ControlSource                      'assegna
strctrl al contenuto della casella di testo
           strfind = Me.trova                               'assegna
strfind alla casella non associata trova
           intposizione = InStr(strctrl, strfind)           'calcola la
posizione del testo da cercare nella casella di testo
           If intposizione > 0 Then                         'se il
testo viene trovato
           strctrlmod = Left(strctrl, intposizione - 1)     'elimina
ciò che sta alla sua destra
           End If
           If intposizione = 0 Then                         'se il
testo non viene trovato
           strctrlmod = Ctl.ControlSource                   'lascia
invariato il contenuto
           End If
           Ctl.ControlSource = strctrlmod & Me.sostituisci  'inserisci
il contenuto della casella non associata sostituisci a destra
    End Select
  Next Ctl
End Sub
ciao ciao co

sono come la microsoft, inizio già a fare gli update :-P Adesso
funziona anche se la stringa "trova" viene lasciata vuota, e se trova
delle etichette con la stringa cercata modifica anche loro (utile per
identificare la formula applicata sulla singola pagina)
ciao ciao co
Sub scimmiette_ammaestrate(obj)
Dim Ctl As Control
Dim strctrl As String
Dim strfind As String
Dim strctrlmod As String
Dim intposizione As Integer
  For Each Ctl In obj.Parent.Controls                       'per ogni
oggetto
    Select Case Ctl.ControlType
      Case Is = acTextBox                                   'che sia
casella di testo
           strctrl = Ctl.ControlSource                      'assegna
strctrl al contenuto della casella di testo
           If Me.trova <> "" Then
            strfind = Me.trova                               'assegna
strfind alla casella non associata trova
            intposizione = InStr(strctrl, strfind)           'calcola
la posizione del testo da cercare nella casella di testo
            If intposizione > 0 Then                         'se il
testo viene trovato
            strctrlmod = Left(strctrl, intposizione - 1)     'elimina
ciò che sta alla sua destra
            End If
            If intposizione = 0 Then                         'se il
testo non viene trovato
            strctrlmod = Ctl.ControlSource                   'lascia
invariato il contenuto
            End If
           End If
           Ctl.ControlSource = strctrlmod & Me.sostituisci  'inserisci
il contenuto della casella non associata sostituisci a destra
           Case Is = acLabel                                   'che sia
casella di testo
           strctrl = Ctl.Caption                      'assegna strctrl
al contenuto della casella di testo
           If Me.trova <> "" Then
            strfind = Me.trova                               'assegna
strfind alla casella non associata trova
            intposizione = InStr(strctrl, strfind)           'calcola
la posizione del testo da cercare nella casella di testo
            If intposizione > 0 Then                         'se il
testo viene trovato
            strctrlmod = Left(strctrl, intposizione - 1)     'elimina
ciò che sta alla sua destra
            Ctl.Caption = strctrlmod & Me.sostituisci  'inserisci il
contenuto della casella non associata sostituisci a destra
            End If
            End If
