Newsgroup: it.comp.lang.visual-basic
Titolo: Un aiutino-ONE vba excel

Ciao a tutti, sto costruendo un piccolo foglio di excel che mi stampa il
frontale di alcuni bolletini postali con un interfaccina grafica e
numeri in lettere automatici, nessun problema tutto ok ma ogni volta che
premo il tasto stampa vorrei che quei dati, persona  importo data  e
città mi vengano memorizzati in un altro foglio  e devo vare in modo che
quei dati che memorizzo in una matrice vengano scritti nel foglio
incolonnati, bene non ne sto cavando piedi da dopo la matrice, cioe non
riesco ancora a trovare la soluzione che oltre ad incolonnarmi i dati,
controlli fino a che punto sono arrivato ed inizi a memorizzare dalla
riga successiva...
aiutatemi
grazieeeeeee

...

Non sono molto esperto di Excel comunque metterei nel foglio  la funzione
conta.valori che ti restituisce il numero di celle non vuote di una matrice
di celle per es:
=CONTA.VALORI(A1:A500)
ti restituisce il numero di celle contenenti un valore nella colonna A
quando attivi la macro di stampa verifichi il valore e scrivi i dati nelle
celle della riga successiva al valore riportato
ricorda di memorizzare il valore in una variabile e incrementarlo di uno
prima di scrivere nelle celle della nuova riga e non usare direttamente il
riferimento perche dopo la scrittura della cella nella colonna A il volre
viene automaticamente incrementato.
Ciao Stefano

Potrebbe essere uno buono spunto ma non volevo usare formule, bensi arrivarci
via codice
nel floglio fronte
cella A1= nome
cella C5= indirizzo
CellaG6= data
clic su pulsante "stampa" e stampa frontale modulo
clic su pulsante "registra" e
---> i tre valori finiscono in una matrice (1 to 3)
poi nel foglio "pagamenti"  i valori verranno incollatti nelle rispettive celle
itestate
| nome | indirizzo   |data     |
|fabio   |Via Re     |12/8/99| ---->registrazione dei primi tre valori che con
il clic su registra
---->successivo click con altri valori
| nome | indirizzo   |data     |
|fabio   |Via Re     |12/8/99|
|pippo  |Via topo  |11/9/00| sotto la riga già registrata e via di seguito
--->speriamo bene in qualche dritta oppure anche esempio, in effetti excel 2000
crea automaticamente una funzione del genere ma oltre che mi va in errore non
mi scrive neanche una linea di codice per trarre insegnamenti
ba!
aloha


 > >riga successiva...
Probabilmente, anzi certamente, esiste una soluzione più elegante, ma dico
la mia....
Perchè non inserire nel foglio dove vai a scrivere i dati della matrice un
contatore?
Intendo dire una cella che ti faccia da contatore dove immagazzinare il
valore dell'ultima riga che hai scritto.
Puoi anche nasconderla, se non ti va di vederla, oppure metterla chissà
dove....
Poi con worksheets("Pincopalla").cells(contatore+1, colonna) accedi alla
riga successiva ogni volta che devi scrivere....
Saluti.

crea automaticamente una funzione del genere ma oltre che mi va in errore
non
Se non vuoi usare formule puoi fare un ciclo per verificare se le celle sono
vuote
qualcosa tipo
for riga= 1 to 1000
    if foglio1.cells(riga,1)="" then
        ............
        exit for
    end if
next
non sono sicuro della sintassi che ora non ho modo di controllare ma
dovrebbe funzionare pero' tieni conto  che in excel, un ciclo di questo
tipo,  e' molto piu' lento dell'uso di una singola formula
e diventa sempre piu' lento con l'aumentare delle righe scritte.
Tempo fa ho scritto una routine per controllare dei valori su un foglio
contenente un anagrafe di circa 700 indirizzi ed occorrevano piu' di 3
minuti, anche se il controllo era abbastanza complesso la velocita' di excel
e' comunque decisamente bassa un analogo ciclo in VB su un database simile
richiede pochi secondi.
Ciao Stefano

In effetti raga' avevo tutto davanti e mi andava continuamente in errore, e
nella mia ignoranza mi dicevo che ero troppo  ignorante;  non ne sono sicuro
(perche ho fatto tremila prove)  ma forse alla fine ho cambiato cells con range
ed ha funzionato tutto :
  Dim MatriceRicev(1 To 6) As Variant
Sub paga()
    MatriceRicev(1) = Worksheets("fornitori").Range("G5").Value
    MatriceRicev(2) = Worksheets("fornitori").Range("B7").Value
    MatriceRicev(3) = Worksheets("fornitori").Range("B13").Value
    MatriceRicev(4) = Worksheets("fornitori").Range("K16").Value
    MatriceRicev(5) = Worksheets("fornitori").Range("B4").Value
    MatriceRicev(6) = Worksheets("fornitori").Range("B5").Value
    Dim RigaTrans As Object
    Set RigaTrans = Worksheets("pagate").Range("A1").CurrentRegion
    NuovaRiga = RigaTrans.Rows.Count + 1
    For i = 1 To 6
    With Worksheets("pagate")
           .Cells(NuovaRiga, i).Value = MatriceRicev(i)
    End With
   Next i
End Sub


 riga successiva...
Non ho capito il discorso riguardo la matrice. Per il resto farei cosi':
Option Explicit
Private Sub Workbook_BeforePrint( _
ByRef Cancel As Boolean _
)
Const sLOC_FORMNAME     As String = "Foglio2"
Const sLOC_DATABASENAME As String = "Foglio1"
' Ho usato sia celle con nomi che coordinate
' a scopo esemplificativo: io preferisco
' usare i nomi.
Const sLOC_STARTDB      As String = "C4"
Const sLOC_FIELD1NAME   As String = "ValCampo1"
Const sLOC_FIELD2NAME   As String = "E8"
Const sLOC_FIELD3NAME   As String = "ValCampo3"
Dim obj                 As Object
Dim wshDatabase         As Excel.Worksheet
Dim lRows               As Long
  For Each obj In Application.ActiveWindow.SelectedSheets
    With obj
      If .Name = sLOC_FORMNAME Then
        Set wshDatabase _
          = obj.Parent.Worksheets(sLOC_DATABASENAME)
        With wshDatabase.Range(sLOC_STARTDB).CurrentRegion
          Let lRows = .Rows.Count
          Let .Offset(lRows, 0).Resize(1, 1).Value _
            = obj.Range(sLOC_FIELD1NAME).Value
          Let .Offset(lRows, 1).Resize(1, 1).Value _
            = obj.Range(sLOC_FIELD2NAME).Value
          Let .Offset(lRows, 2).Resize(1, 1).Value _
            = obj.Range(sLOC_FIELD3NAME).Value
        End With
        Set wshDatabase = Nothing
        Exit For
      End If
    End With
  Next
  Set obj = Nothing
End Sub
--
Ciao.
Maurizio