Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Conversione macro excel in una macro access

70 views
Skip to first unread message

Paolo

unread,
Jun 9, 2009, 4:52:24 PM6/9/09
to

Ciao a tutti
avrei seriamente bisogno di una mano per risolvere questo problema:
ho interfacciato un foglio excel con un programma TEE3270 che uso in ufficio
per potere ricavare da transazione specifiche dei dati che compaiono sullo
schermo e riportarle in colonne excel.
In poche parole questo foglio excel non fa altro che, all'esecuzione della
macro, creare un'istanza con la libreria specifica del programma TEE3270
(TeepsAPi.dll)e lanciare una transazione "MONF" che richiede in posizioni
ben precise due dati "fermo"e "data" (colonna A e B del foglio Excel)

ps.PutString 6, 13, fermo
ps.PutString 6, 26, data

e la pressione del tasto INVIO.

Fatto questo sullo schermo del PC mi vengono forniti dati che il programma
colloca nelle successive colonne C D E F G H (la H la ricava come si puo'
vedere da altra transazione ma il discorso non cambia).

A B
C D E F
G H
Fermo Data Targa Data ACI
Num Elenco RP CF Ditta

Ricavati questi dati il programma tramite la Stampa Unione con Word stamper�
un report.
Poi cancella il rigo 1 in quanto lavora sempre � solo su un record alla
volta (mi serve cos�).

La macro che raccoglie i dati e li scrive sul foglio excel � questa:
ho usato molte volte in pi� punti l'istruzione
ps.WaitMap
a causa della lentezza della risposta del sistema.

Ora vorrei fare una cosa ma non la so fare assolutamente:

Convertire questa macro in una macro che lavora solo ed esclusivamente in
Access.

Lavorare con una tabella con i seguenti campi
fermo
data
targa
dataaci
elenco
RP
cf
DITTA

Immettere tramite maschera i 2 campi "fermo" e "data"
e far eseguire mediante pulsante associato alla macro tutto il ciclo per
riempire il primo record della tabella con tutti e 8 i dati.

In poche parole le celle ABCDEFGH diventano campi.
Creare poi un report in access e stampare la pagina per poi cancellare il
singolo record per passare ad uno successivo.


La macro che funziona perfettamente in mabiente Excel � la seguente:

Dim fermo As String
Dim data As String
Dim targa As String
Dim dataaci As String
Dim elenco As String
Dim RP As String
Dim cf As String
Dim DITTA As String

Sub estraiBIS()

Set ps = CreateObject("TeePsApi.PsApiObj") ' crea un istanza


ps.PutString 0, 1, "MONF"
ps.SendMap 0, 5, "ENTER"
ps.WaitMap (2)

ps.WaitMap (2)

fermo = Cells(2, 1)
data = Cells(2, 2)


ps.PutString 6, 13, fermo
ps.PutString 6, 26, data
ps.SendMap 3, 75, "ENTER"
ps.WaitMap (3)


targa = ps.GetString(6, 53, 7)
dataaci = ps.GetString(9, 22, 10)
elenco = ps.GetString(9, 62, 6)
RP = ps.GetString(10, 70, 10)
cf = ps.GetString(4, 10, 16)
ps.WaitMap (3)


Cells(2, 3) = targa
Cells(2, 4) = dataaci
Cells(2, 5) = elenco
Cells(2, 6) = RP
Cells(2, 7) = cf


ps.PutString 0, 1, "mofa"
ps.SendMap 0, 5, "ENTER"
ps.WaitMap (3)
cf = Cells(2, 7)

ps.PutString 3, 12, cf

ps.SendMap 1, 5, "ENTER"

ps.WaitMap (3)

DITTA = ps.GetString(4, 16, 20)

Cells(2, 8) = DITTA

fine:

End Sub


Datemi una mano ve ne sar� grata


Sergio MAZZA

unread,
Jun 10, 2009, 1:54:03 AM6/10/09
to
"Paolo" <twi...@libero.it> ha scritto nel messaggio
news:cYzXl.19305$1s6...@twister2.libero.it...


Sub nomeBottone_OnClick()

on error goto errori
Dim ps as Object

> Dim fermo As String
> Dim data As String
> Dim targa As String
> Dim dataaci As String
> Dim elenco As String
> Dim RP As String
> Dim cf As String
> Dim DITTA As String
>

> Set ps = CreateObject("TeePsApi.PsApiObj") ' crea un istanza
>
> ps.PutString 0, 1, "MONF"
> ps.SendMap 0, 5, "ENTER"
> ps.WaitMap (2)
>
> ps.WaitMap (2)
>

'--> assegna il valore inserito nelle caselle di testo alle variabili
fermo = Me!fermo
data = me!data

>
> ps.PutString 6, 13, fermo
> ps.PutString 6, 26, data
> ps.SendMap 3, 75, "ENTER"
> ps.WaitMap (3)
>
> targa = ps.GetString(6, 53, 7)
> dataaci = ps.GetString(9, 22, 10)
> elenco = ps.GetString(9, 62, 6)
> RP = ps.GetString(10, 70, 10)
> cf = ps.GetString(4, 10, 16)
> ps.WaitMap (3)
>

> ps.PutString 0, 1, "mofa"
> ps.SendMap 0, 5, "ENTER"
> ps.WaitMap (3)

> ps.PutString 3, 12, cf


>
> ps.SendMap 1, 5, "ENTER"
>
> ps.WaitMap (3)
>
> DITTA = ps.GetString(4, 16, 20)
>

'--> query di accodamento
CurrentDb.Execute "Insert Into nomeTabella (fermo, data, targa, dataaci,
elenco, RP, cf, DITTA) " & _
"Values (" & me!fermo & "," & me!data & "," & _
targa & "," & dataaci & "," & elenco & "," & RP & ","
& cf & "," & DITTA & ")"

> fine:

set ps = nothing
exit sub

errori:
msgbox err.number & "," & err.description
set ps = nothing

> End Sub


> Datemi una mano ve ne sar� grata

Grata? Paolo?

A parte gli scherzi; crea una maschera, ci inserisci due caselle di testo
(chiamale: fermo e data), crea un bottone e gestisci l'evento "su clic"
inserendoci il tuo codice con le modifiche che ti ho suggerito.
Ovviamente dovrai creare la tabella con i campi e adattare la stringa della
query di accodamento con la tipologia giusta di campo definita nella
tabella; per essere pi� chiari: se il campo fermo lo hai definito in tabella
come un testo, nella stringa dovrai racchiudere i suoi valori con doppi
apici (") o apice singolo ('):
...
"Values ('" & me!fermo & "'," & me!data & "," & _
...

occhio con i campi in formato data/ora; dovrai racchiuderli tra # e (se non
ricordo male) formattarli mm/gg/aaaa.

Dovrai anche, ma penso che lo sai di sicuro, inserire i riferimenti alla
libreria TeepsAPi.dll.

Altra cosa; non utilizzare nomi riservati ad access: es. data, numero,
descrizione... pu� generare confusione ad access interpretandoli male...

Ciao.
--
Sergio MAZZA


Paolo

unread,
Jun 10, 2009, 11:24:05 AM6/10/09
to
Ti ringrazio ci provo subito ...

Lisa mio fratello � Paolo uso il suo account dal suo pc..


Ti faccio sapere OK?

"Sergio MAZZA" <sergi...@tiscali.it> ha scritto nel messaggio
news:4a2f4b6c$0$6839$5fc...@news.tiscali.it...

Sergio MAZZA

unread,
Jun 10, 2009, 11:43:06 AM6/10/09
to
"Paolo" <twi...@libero.it> ha scritto nel messaggio
news:peQXl.20242$9f6....@twister1.libero.it...

> Ti ringrazio ci provo subito ...
>
> Lisa mio fratello � Paolo uso il suo account dal suo pc..
>
>
> Ti faccio sapere OK?

Sono qui...

Ciao.
--
Sergio MAZZA

Paolo

unread,
Jun 11, 2009, 12:52:45 PM6/11/09
to

"Sergio MAZZA" <sergi...@tiscali.it> ha scritto nel messaggio
news:h0ok9c$l5u$1...@tdi.cu.mi.it...

> "Paolo" <twi...@libero.it> ha scritto nel messaggio
> news:peQXl.20242$9f6....@twister1.libero.it...
>> Ti ringrazio ci provo subito ...
>>
>> Lisa mio fratello � Paolo uso il suo account dal suo pc..

>>
>>
>> Ti faccio sapere OK?
>
> Sono qui...
>
> Ciao.
> --
> Sergio MAZZA
>

Ho fatto come mi hai detto:

la tabella creata si chiama MONF e i campi al suo interno sono tutti di tipo
testo.

La macro sembra funzionare benissimo infatti in TEE3270 vedo le varie
transazioni che si susseguono riportando i dati corretti ma nel momento in
cui mi f� (credo) la query di accodamento mi esce questo msg:

3075,Errore di sintassi (operatore mancante) nell'espressione della query
'COLETTA UGO'.

dove coletta ugo � esattamente il nome della DITTA che dovrebbe scrivere nel
campo della tabella.

Naturalmente non scrive nulla nel record 1.

Ma siccome sono imbranata non ho trovato l'errore.

Vedi se ci capisci qualcosa


Paolo

unread,
Jun 11, 2009, 4:43:47 PM6/11/09
to
altro problema come da te previsto il campo DATA

ho provato ad accodare alla tabella solo i due campi FERMO E DATA e funziona
la query di accodamento solo che il VALORE del campo DATA, scrito per
esempio 10/06/2009 me lo converte nella tabella dove il formato DATA � testo
in una bella divisione con questo risultato 2,492522.
ho fatto come hai detto tu mettendo il valore & me!data tra # ma mi da
errore quindi penso che la stessa cosa si verificher� con DATAACI

Sigh

Se vuoi ti mando per email l'mdb tanto � solo 400 kb

ciao


"Paolo" <twi...@libero.it> ha scritto nel messaggio

news:xDaYl.20889$9f6....@twister1.libero.it...

Sergio MAZZA

unread,
Jun 12, 2009, 2:57:35 AM6/12/09
to
"Paolo" <twi...@libero.it> ha scritto nel messaggio
news:70eYl.21015$9f6....@twister1.libero.it...

> altro problema come da te previsto il campo DATA
>
> ho provato ad accodare alla tabella solo i due campi FERMO E DATA e
> funziona la query di accodamento solo che il VALORE del campo DATA, scrito
> per esempio 10/06/2009 me lo converte nella tabella dove il formato DATA �
> testo in una bella divisione con questo risultato 2,492522.
> ho fatto come hai detto tu mettendo il valore & me!data tra # ma mi da
> errore quindi penso che la stessa cosa si verificher� con DATAACI
>
> Sigh
>
> Se vuoi ti mando per email l'mdb tanto � solo 400 kb
>
> ciao


Con l'mdb non ci faccio nulla perch� il problema � la costruzione della
query di accodamento con i valori che vengono ricevuto al momento.
Invia, qui nell'NG, l'istruzione che fa l'accodamento, o tutto il codice che
stai utilizzando; magari si risolve in poco...

Ciao.
--
Sergio MAZZA


Paolo

unread,
Jun 15, 2009, 4:56:36 PM6/15/09
to
Ti invio il codice della macro che utilizzo:

Sub Comando10_Click()

On Error GoTo errori
Dim ps As Object

Dim FERMO As String
Dim DATA As String


Dim targa As String
Dim dataaci As String
Dim elenco As String
Dim RP As String
Dim cf As String
Dim DITTA As String

Set ps = CreateObject("TeePsApi.PsApiObj") ' crea un istanza

' ps.PutString 0, 1, "MONF"
' ps.SendMap 0, 5, "ENTER"
' ps.WaitMap (2)
'
' ps.WaitMap (2)
'

'--> assegna il valore inserito nelle caselle di testo alle variabili

FERMO = Me!FERMO
DATA = Me!DATA


ps.PutString 6, 13, FERMO
ps.PutString 6, 26, DATA


ps.SendMap 3, 75, "ENTER"
ps.WaitMap (3)

targa = ps.GetString(6, 53, 7)
dataaci = ps.GetString(9, 22, 10)
elenco = ps.GetString(9, 62, 6)
RP = ps.GetString(10, 70, 10)
cf = ps.GetString(4, 10, 16)
ps.WaitMap (3)

ps.PutString 0, 1, "mofa"
ps.SendMap 0, 5, "ENTER"
ps.WaitMap (3)

ps.PutString 3, 12, cf

ps.SendMap 1, 5, "ENTER"

ps.WaitMap (3)

DITTA = ps.GetString(4, 16, 20)


'--> query di accodamento
CurrentDb.Execute "Insert Into monf (fermo, data, targa, dataaci, elenco,

RP, cf, DITTA) " & _

"Values (" & Me!FERMO & "," & Me!DATA & "," & _


targa & "," & dataaci & "," & elenco & "," & RP & "," & cf & "," & DITTA &
")"

fine:

Set ps = Nothing
Exit Sub

errori:
MsgBox Err.Number & "," & Err.Description
Set ps = Nothing

End Sub


La tabella MONF ha tutti i campi in formato testo che possono naturalmente
essere cambiati al bisogno.
"Sergio MAZZA" <sergi...@tiscali.it> ha scritto nel messaggio
news:4a31fdfd$0$691$5fc...@news.tiscali.it...

Sergio MAZZA

unread,
Jun 16, 2009, 2:22:40 AM6/16/09
to
"Paolo" <twi...@libero.it> ha scritto nel messaggio
news:8AyZl.23191$9f6....@twister1.libero.it...


Allora niente di pi� semplice che modificare la stringa inserendoci i
caratteri, indicati rima, che delimitano le stringhe:
...


CurrentDb.Execute "Insert Into monf (fermo, data, targa, dataaci, elenco,
RP, cf, DITTA) " & _

"Values (" & chr$(34) & Me!FERMO & chr$(34) & "," & _
chr$(34) & Me!DATA & chr$(34) & "," & _
chr$(34) & targa & chr$(34) & "," & _
chr$(34) & dataaci & chr$(34) & "," & _
chr$(34) & elenco & chr$(34) & "," & _
chr$(34) & RP & chr$(34) & "," & _
chr$(34) & cf & chr$(34) & "," & _
chr$(34) & DITTA & chr$(34) & ")"
...

Ho utilizzato il chr$(34) per evitare un problema con apici o doppi apici...

Ciao.
--
Sergio MAZZA

Paolo

unread,
Jun 17, 2009, 2:32:48 PM6/17/09
to
PERFETTO
Funziona tutto a meraviglia ti ringrazio della collaborazione


Ciao


"Sergio MAZZA" <sergi...@tiscali.it> ha scritto nel messaggio
news:4a373bd2$0$710$5fc...@news.tiscali.it...

> Allora niente di pi� semplice che modificare la stringa inserendoci i

Sergio MAZZA

unread,
Jun 18, 2009, 3:10:50 AM6/18/09
to
"Paolo" <twi...@libero.it> ha scritto nel messaggio
news:kFa_l.23239$1s6....@twister2.libero.it...

> PERFETTO
> Funziona tutto a meraviglia ti ringrazio della collaborazione
>
>
> Ciao


Grazie a te per il riscontro...

Ciao.
--
Sergio MAZZA

0 new messages