Rendere "relativo" il nome di un campo in VBA

di il
6 risposte

Rendere "relativo" il nome di un campo in VBA

Buongiorno a tutti,

sono in questa situazione:

Select Case rs2.Fields("1") 

dove devo eseguire degli update sul campo 1 al termine delle quali dovrei ripetere una cosa simile nelle successive colonne della tabella (che ho chiamato, per comodità, 2,3, 4 ecc.) e vorrei inserire il tutto in un ciclo.

Come posso fare?

Attendo vs. lumi, saluti

6 Risposte

  • Re: Rendere "relativo" il nome di un campo in VBA

    Non ho capito nulla

  • Re: Rendere "relativo" il nome di un campo in VBA

    Buongiorno Oregon, provo a spiegarmi meglio.

    Tutto nasce da un gioco statistico: immagina di avere 1000 candidati e una moneta testa o croce. Dopo mille lanci resteranno circa 500 con la croce e passano il turno, poi toccherà ai superstiti giacare ancora ecc. per un totale di 10 volte.

    Con una probabilità di 1/(2^10) su 1000 candidati uno potrebbe farcela. 
    
    Allora ho provato a scivere il seguente codice:
    
    Su Module1
    Public Sub azione()
    'cancellazione record table1
    Dim rs1 As DAO.Recordset
    Set rs1 = CurrentDb.OpenRecordset("Table1", dbOpenTable)
    Dim max As Long
    max = rs1.RecordCount
    Dim i As Long
    For i = 1 To max
    rs1.MoveFirst
    DoCmd.SetWarnings False
    rs1.Delete
    max = max - 1
    Next
    
    'inserimento 1000 record nuovi
    For i = 0 To 999
    rs1.AddNew
    rs1.Fields("soggetto") = i
    rs1.Update
    Next
    
    'prima estrazione
    rs1.MoveFirst
    For i = 0 To 999
       Dim y As Double
       y = 123
       Randomize
       
       Select Case Rnd(y)
       
           Case Is <= 0.5
           rs1.Edit
           rs1.Fields("1") = 0
           rs1.Update
           rs1.MoveNext
           
           Case Is > 0.5
           rs1.Edit
           rs1.Fields("1") = 1
           rs1.Update
           rs1.MoveNext
           
       
       
       End Select
    Next
    
    
    'chiusura collegamento
    rs1.Close
    Set rs1 = Nothing
    avanti
    End Sub  

    su Module2

    Public Sub avanti()

    Dim rs2 As DAO.Recordset
    Set rs2 = CurrentDb.OpenRecordset("Table1", dbOpenTable)
    
    
    'seconda estrazione
    rs2.MoveFirst
    Dim i As Long
    For i = 0 To 999
    
    
    
        Select Case rs2.Fields("1")
        
            Case Is = 0
        
                rs2.Edit
                rs2.Fields("2") = 0
                rs2.Update
                rs2.MoveNext
            
            Case Is = 1
        
            Dim y As Double
            y = 123
            Randomize
            
            Select Case Rnd(y)
            
                Case Is <= 0.5
                rs2.Edit
                rs2.Fields("2") = 0
                rs2.Update
                rs2.MoveNext
                
                Case Is > 0.5
                rs2.Edit
                rs2.Fields("2") = 1
                rs2.Update
                rs2.MoveNext
            
            End Select
    
    End Select
        
    Next
    
    avanti1
    
    End Sub
    Direi che il Module 2 andrebbe iterato altre 9 volte da cui la mia domanda iniziale: se potessi rendere relativo il riferimento a 
    Select Case rs2.Fields("1") . 
  • Re: Rendere "relativo" il nome di un campo in VBA

    18/08/2024 - Faustinator ha scritto:


    immagina di avere 1000 candidati e una moneta testa o croce. Dopo mille lanci resteranno circa 500 con la croce e passano il turno, poi toccherà ai superstiti giacare ancora ecc. per un totale di 10 volte.

    Non ho pensato minimamente alla correttezza del codice per raggiungere quello che hai indicato, ad una prima lettura ho visto solo parti che possono essere scritte meglio come impostazione generale.

    Una delle prime azioni che compi è svuotare la tabella Table1 con un ciclo su tutti i record e un delete per ogni record. No!

    DbEngine(0)(0).Execute "DELETE FROM Table1"

    e con una riga è fatto tutto, nel modo giusto tra l'altro. E' uno spreco di risorse passare tutti i record per cancellarli uno alla volta. Inoltre disabiliti gli avvertimenti con DoCmd.SetWarnings False (che non riattivi) quando esiste il metodo Execute fatto apposta per lanciare le query d'azione senza dover disabilitare gli avvertimenti.

    Anche nel prosieguo del codice ci sono molte porzioni inultimente ripetute. Basterebbe una semplice If nella maggiorparte dei casi con all'interno solo la parte che cambia, magari con l'uso di una variabile.

    Ribadisco: sono solo suggerimenti validi in generale per la scrittura del codice, non so se ti aiuteranno ad ottenere il risultato che vuoi raggiungere.

  • Re: Rendere "relativo" il nome di un campo in VBA

    Per la question del DELETE, ti ha già risposto PHIL,c direi inutile proprio ciclare per cancellarne 1 alla volta.

    Per il ciclo di cui parli, sempre serva… perchè il Recordset ha la collection Fields che consente di accedere ai campi… es:

    Dim rs 		AS DAO.Recordset
    Dim fld 	As DAO.Field
    
    Ser rs=CurrentDB.OpenRecordset(....)
    rs.MoveFirst
    Do Until rs.Eof
    	rs.Edit
    	For each fld in rs.Fields
    		Debug.Print fld.name, fld.value
    		' ovviamente se fai l'EDIT sul RS lo fai a monte
    	Next
    	rs.Update
    	rs.MoveNext
    Loop

    Meglio ancora se inglobi in una Transazione…

    Se invece vuoi proprio ciclare i numeri perchè ti piace di più… cicla i numeri il riferimento al Campo è una Stringa… es:

    Dim Pippo As Integer
    pippo=1
    rs.Fields(cstr(Pippo))="TuoDato1"
    pippo=2
    rs.Fields(cstr(Pippo))="TuoDato2"
    
    Dim X As Integer
    For X=1 to 100
    	rs.Fields(cstr(X))="TuoDato" & X
    Next

    Attenzione che il Fields supporta l'indicizzazione dei Campi quindi passare 1 e passare “1” sono riferimenti potenzialmente differenti…

    Se nell'ordine dei campi creati hai prima il campo “2” passando Indice 1 punti al Campo “2” e non “1”

    Questa confusione accade se non comprendi bene la differenza nell'indicizzazione per Nome o per Indice, ed avendo nominato i campi come Numero può uteriormente peggiorare lo sbaglio.

  • Re: Rendere "relativo" il nome di un campo in VBA

    18/08/2024 - Faustinator ha scritto:


    Tutto nasce da un gioco statistico: immagina di avere 1000 candidati e una moneta testa o croce. Dopo mille lanci resteranno circa 500 con la croce e passano il turno, poi toccherà ai superstiti giacare ancora ecc. per un totale di 10 volte.

    Non so se ho capito cosa vuoi fare ma….

    1. I giocatori sono in una tabella?
    2. La tabella può avere un campo dove i giocatori puntano l'estrazione “testa” o “croce”
    3. Random bla bla per verificare seesce un pari o un dispari
    4. Se pari=testa se dispari=croce
    5. Se esce testa: delete ftom tabella where puntata="croce" se esce croce delete bla bla where “testa”
    6. Se tabella = empty Fine nessun vincitore altrimenti prosegui
    7. Azzeri le puntate ai restanti record dei superstiti
    8. Dei superstiti si chiede di puntare
    9. Controlli con select bla bla where puntata = null e sehai un insieme vuoto rilanci la funzione dal punto3
    10. Alla fine ne resterà uno solo (o nessuno Armageddon!!!!)

    Per tradurlo in vba attendo chi più ferrato di me in access anche perché se non si tratta di moneta ci sono funzioni che ad ogni ciclo possono estrarre un record casuale e eventualmente eliminarlo (i quel caso alla fine resterà solo un record.

  • Re: Rendere "relativo" il nome di un campo in VBA

    Intanto di nuovo grazie, mi imbarco in questi giochi statistici un po' per divertimento ma soprattutto per provare a scrivere un po' di codice (ho iniziato a gennaio). Nella fattispecie la domanda è: se prendo 1000 persone e a ciascuna faccio fare un tiro alla moneta mi attedno che a ogni round il campione dei vinceti (es. con croce) si dimezzi. Dunque dopo 10 lanci (2^10) dovrebbere restare un gruppo ristretto di concorrenti (1/1024*1000). Volevo manterere l'informazione delle 10 giocate, quandi una matrice di 1000 righe per 10 colonne (+ una per dare un “nome” ai concorrenti). Alla luce delle vostre considerazioni pare funzionare tutto abbastanza bene ma voglio verificare meglio con più attenzione. Sto imparando molto da voi ! Un saluto, m, 

Devi accedere o registrarti per scrivere nel forum
6 risposte