incollare dei valore



  • incollare dei valore
    di volpeirrequieta (utente non iscritto) data: 14/08/2016 12:30:20

    allora ho un piccolo problema,
    ho la colonna piena di dati:la colonna N del foglio "beta" il numero di righe non è fisso, fino all'ultima riga scritta
    e ho una textbox1

    mi servirebbe incollare nel foglio "alfa" nelle colonne A e B,
    nella colonna B del foglio "alfa", i valori del foglio "beta" della colonna N", e per ogni riga incollata dovrei mettere nella colonna A il valore della textbox1

    non so se sono stato chiaro, ma non riesco a capire come venire fuori da questo dilemma! sul far capire che per ogni riga incollata nella colonna B, deve comparire nella colonna A il valore della testbox

    tutto questo dovrebbe avvenire al click di un pulsante!




  • di patel data: 14/08/2016 12:41:46

    allega un file di esempio con i dati, spiegazioni e risultato desiderato





  • di volpeirrequieta (utente non iscritto) data: 14/08/2016 13:07:59

    ho allegato il file, se non è chiara qualcosa potete chiedermi senza problemi



  • di Vecchio Frac data: 14/08/2016 13:23:08

    @volpeirrequieta (bel nick ^_^)
    rifletti su questa tua riga di codice e dimmi secondo te cosa fa:
    ws.Cells(iRow, 2).Value = "bravo!N1:N" & UR


    Il tuo intento è assegnare alla cella in iRow, colonna 2 il risultato dell'espressione? o un testo letterale? ^_^
    Quando avrai capito questo, avrai trovato la soluzione.





  • di Vecchio Frac data: 14/08/2016 13:36:11

    Comunque il tuo codice è un po' impreciso rispetto alla spiegazione che hai dato.
    Dalla quale capisco che per ogni valore del foglio "bravo" (non "beta") vuoi riportare il valore inserito nella textbox in una riga successiva del foglio "alfa", ponendogli accanto (in colonna B) i valori del range N1:N... del foglio "bravo".
    Se è questa l'interpretazione corretta, hai ancora qualche passo da fare e un paio di righe da aggiungere.
    Ma sei sulla buona strada.

    p.s. ricordati come buona prassi di inserire sempre la direttiva Option Explicit in testa ai tuoi moduli.





  • di volpeirrequieta (utente non iscritto) data: 14/08/2016 13:36:48

    ma se riesco a sistemare quella riga, me lo attua il procedimento che per ogni riga mi metta il valore della textbox?

    grazie per il complimento



  • di Vecchio Frac data: 14/08/2016 13:39:12

    Non ancora... ti manca un passaggio :) (cioè la destinazione ... tu stai incollando un range di valori non un valore solo)
    Provaci, poi ti posto la mia soluzione.





  • di volpeirrequieta (utente non iscritto) data: 14/08/2016 14:01:42

    fin ora sono arrivato fino all'inserimento di una cella.. ora la modifico per più celle

    ws.Cells(iRow, 2).Formula = "= bravo!N1"



  • di Vecchio Frac data: 14/08/2016 14:26:33

    Probabilmente resterai deluso ^_^
    Ragioniamo sulla proprietà Value, non su Formula.
    Una cella riceve un valore assegnandoglielo, per esempio Range("A2").Value = Range("B3").Value.
    Un range di celle riceve un valore da un altro range di celle se i due range sono omogenei (cioè hanno la stessa grandezza): Range("A1:A5").Value = Range("B3:B7").Value; questo metodo è simile a Range.Copy.
    Ora poichè hai calcolato iRow (primo posto libero del foglio alfa) e ur (estensione del range dati), piuttosto che Range() userei Cells() con i riferimenti opportuni di riga e colonna per assegnare d'un botto al range in alfa (di estensione uguale al range in bravo) i valori dei dati in bravo.
    Più difficile a spiegare che a fare ^_^






  • di giuseppe de gaetano (utente non iscritto) data: 14/08/2016 14:44:16

    e quindi la base di partenza è cosi:
    Cells().Value = Cells().Value

    giusto?



  • di Vecchio Frac data: 14/08/2016 15:13:29

    Giusto! però devi referenziare correttamente i fogli da cui pescare / dove inserire i valori.
    Inoltre ricordati che devi assegnare due gruppi di valori a due distinti range, il primo conterrà i valori della textbox (ripetuti) e il secondo i valori del range dati (foglio "bravo"). Con lo stesso meccanismo, quindi, e non ti serve un For :)





  • di volpeirrequieta (utente non iscritto) data: 14/08/2016 15:27:30

    e quindi come diventa?



  • di Vecchio Frac data: 14/08/2016 15:43:55

    Cos'è che ti blocca? Hai provato a scrivere qualcosa?
    Se sei in difficoltà in generale, scrivi l'algoritmo in italiano ripercorrendo i passi necessari, poi traduci tutto in sintassi VBA corretta.
    Comunque ripeto non sei lontano, io ho fatto poche modifiche al tuo codice :)





  • di volpeirrequieta (utente non iscritto) data: 14/08/2016 16:06:03

    per dire la verità mi mancherebbe sono che si riproduca il valore della testbox per il numero di righe,
    per la seconda colonna mi sono accorto che stavo andando fuori strada con il file "esempio" che avevo creato,per il file che sto creando!
    mi vengo a spiegare meglio, quei dati nel foglio "bravo" ci finivano attraverso una listbox.. però mi sono accorto, che erano tutti i dati quelli che andavo ad incollare, mentre a me servivano solo i file selezionati dalla listbox!

    ho risolto il secondo pezzo con questa formula.. (so che forse stai capendo poco di quello che ti sto dicendo)
    'copia dati nel database(FOGLIO alfa)
    ws.Cells(iRow, 1).Value = Me.TextBox1.Value
    'UR = Sheets("bravo").Range("M100").End(xlUp).Row
    'ws.Cells(iRow, 2).Value = Me.ListBox1.Selected
    Dim Mrange As Range
    Set Mrange = ActiveSheet.Range("B" & ActiveSheet.Rows.Count).End(xlUp).Offset(1, 0)
    With ListBox1
    For i = 0 To .ListCount - 1
    If .Selected(i) Then
    Mrange.Value = .List(i)
    Set Mrange = Mrange.Offset(1, 0)
    End If
    Next i
    End With


    mi manca solo di incollare la textbox per il numero di righe



  • di Vecchio Frac data: 14/08/2016 17:16:05

    Siccome lo scenario è cambiato leggermente e in effetti mancava un'informazione che lo rende diverso, ti allego il codice che avevo messo in piedi io per risolvere il problema iniziale.
    Guardalo un po', vedi come ho fatto e cerca di adattarlo al nuovo contesto.
     
    Option Explicit
    
    Private Sub CommandButton1_Click()
    Dim iRow As Long
    Dim ws As Worksheet
    Dim ur As Long
        Set ws = Worksheets("alfa")
    
        'trova prima  riga vuota nel database
        iRow = ws.Cells(Rows.Count, 1).End(xlUp).Row + 1
               
        'se il "Textbox1" è vuoto compare il  Msgbox "manca NOME"
        If Trim(Me.TextBox1.Value) = "" Then
            Me.TextBox1.SetFocus
            MsgBox " manca NOME"
            Exit Sub
        End If
                
        'copia dati nel database(FOGLIO alfa)
        ur = [COUNTA(bravo!N1:N100)]
        With ws.Range(Cells(iRow, 1), Cells(iRow + ur - 1, 1))
            .Value = TextBox1
            .Value = Range("bravo!N1:N" & ur).Value
        End With
    End Sub
    






  • di volpeirrequieta (utente non iscritto) data: 15/08/2016 03:25:29

    Innanzitutto grazie per il tempo che mi hai dedicato... mi sei stato davvero utile..
    Volevo porti, ma é riferito a chiunque, un ultima domanda.. é possibile countare quante righe vengono selezionate nella listbox.. in modo tale da completare la formula che mi serve?



  • di patel data: 15/08/2016 06:26:41

    si può con ListBox1.ListCount





  • di Vecchio Frac data: 15/08/2016 09:06:46

    cit. "countare quante righe vengono selezionate nella listbox"
    ---> Non c'è un metodo predefinito, devi usare un ciclo come hai fatto tu.

    selezionati = 0
    
    For i = 0 To .ListCount - 1
    If .Selected(i) Then selezionati = selezionati + 1
    next


    @patel
    ListBox.ListCount restituisce il numero di elementi nella listbox, non quelli selezionati. Ci vrrebbe un metodo tipo ListBox.SelectedItems.Count ma non c'è :)





  • di volpeirrequieta (utente non iscritto) data: 15/08/2016 10:45:35

    comunque vecchio frac, la formula che hai postato alle 14/08/2016 17:16:05 risulta incompleta per il file d'esempio che avevo postato.. non so se l'avevi provata!



  • di patel data: 15/08/2016 11:10:56

    cit. da VF
    ListBox.ListCount restituisce il numero di elementi nella listbox, non quelli selezionati...
    -----
    in effetti ho selezionato male ciò che volevo incollare





  • di volpeirrequieta (utente non iscritto) data: 15/08/2016 12:00:39

    a me basterebbe pure completare il codice del file esempio che vi avevo messo, poi mi basterebbe estrarre i dati della listbox in un altra colonna e in seguito andarmeli a riprendere ma la formula che avevi completato, mi risulta errata..
    mi sto riferendo al file d'esempio che ho postato, spiego il perchè mi risulta errata:
    - prima scrive nella colonna A i dati della textbox1
    e poi scrive sempre sulla colonna A i dati recuperati dal foglio "bravo"



  • di Vecchio Frac data: 15/08/2016 19:50:39

    E' vero, mancava lo spostamento del range per incollare i valori nella colonna B.
     
        'copia dati nel database(FOGLIO alfa)
        ur = [COUNTA(bravo!N1:N100)]
        With ws.Range(Cells(iRow, 1), Cells(iRow + ur - 1, 1))
            .Value = TextBox1
            .Offset(, 1).Value = Range("bravo!N1:N" & ur).Value    '<-----
        End With






  • di volpeirrequieta (utente non iscritto) data: 16/08/2016 12:06:36

    allora ora la formula è perfetta grazie.. modificando ora il codice.. in modo tale da usare solo i dati della listbox!
    mi da errore in questa riga... in cosa ho sbagliato?

    "With Sheets("ELENCO").Range(Cells(iRow, 1), Cells(iRow + ur - 1, 1))"


     
    Private Sub CBinserisci_elenco_da_listelibri_Click()
    'questo sotto evita il saltellamento a schermo
    Application.ScreenUpdating = False
    
    'faccio pulire la zona che uso come estrazione dati
    Sheets("listelibri").Range("W1:AD100").ClearContents
    
    Dim iRow As Long
    Dim ws As Worksheet
    Set ws = Worksheets("ELENCO")
    
    'trova prima  riga vuota nel database
        iRow = ws.Cells.Find(What:="*", SearchOrder:=xlRows, _
            SearchDirection:=xlPrevious, LookIn:=xlValues).Row + 1
               
    'se il "TextboxNOMECLIENTE" è vuoto compare il  Msgbox "manca NOME CLIENTE"
     If Trim(Me.TextBoxNOMECLIENTE.Value) = "" Then
                Me.TextBoxNOMECLIENTE.SetFocus
                MsgBox " manca NOME CLIENTE "
                Exit Sub
                End If
                
    Dim iRisposta As Integer
    iRisposta = MsgBox("sicuro di ordinari i libri???", vbYesNo)
    Select Case iRisposta  'impostiamo il Select Case con riferimento al messaggio restituito dalla variabile iRisposta
    Case vbYes                'se risponderemo "Si" :
        
    'copia dati nel FOGLIO(listelibri)
    
    Dim Mrange As Range
    Worksheets("listelibri").Activate
    Set Mrange = ActiveSheet.Range("W" & ActiveSheet.Rows.Count).End(xlUp).Offset(1, 0)
    With ListBox1
        For i = 0 To .ListCount - 1
            If .Selected(i) Then
                  Mrange.Value = .List(i)
                  Set Mrange = Mrange.Offset(1, 0)
            End If
        Next i
    End With
    
    'incollare da listelibri a elenco
     ur = [COUNTA(listelibri!W1:W100)]
        With Sheets("ELENCO").Range(Cells(iRow, 1), Cells(iRow + ur - 1, 1))
            .Value = TextBox1
            .Offset(, 1).Value = Range("listelibri!W1:W" & ur).Value    '<-----
        End With
    
    
    
    'continuazione  msgbox
    Case vbNo        'se sceglieremo "No":
         Exit Sub    'usciremo dalla routine
    Case Else
    End Select
    End Sub



  • di Vecchio Frac data: 16/08/2016 13:10:04

    Dipende dal tipo di errore che ricevi.
    Il più banale è che il foglio "ELENCO" non esista (ma ti avrebbe dato errore sopra, all'assegnazione con set ws = worksheets("elenco").
    Potrebbe anche essere che i riferimenti di riga o colonna diano zero o negativo, cioè iRow oppure il risultato di iRow+ur-1, cosa che ritengo probabile se non ci sono già dati cioè se pareti con un db vuoto (l'errore di runtime ha codice 1004?)
    Devi prevedere questo caso:
    ur = [COUNTA(listelibri!W1:W100)]
    
    if ur = 0 then ur = 1






  • di Vecchio Frac data: 16/08/2016 13:12:04

    Anche iRow potrebbe avere problemi...
    La mia proposta per trovare la prima riga vuota in cui inserire qualcosa è
    'trova prima  riga vuota nel database
    
    iRow = ws.Cells(Rows.Count, 1).End(xlUp).Row + 1






  • di volpeirrequieta (utente non iscritto) data: 16/08/2016 14:19:46

    ho risolto selezionando prima il foglio!! grazie veramente dell'aiuto che mi avete dato.. :)
     
    Worksheets("ELENCO").Activate
    'incollare da listelibri a elenco
     ur = [COUNTA(listelibri!W1:W100)]
        With ws.Range(Cells(iRow, 1), Cells(iRow + ur - 1, 1))
            .Value = TextBox1
            .Offset(, 1).Value = Range("listelibri!W1:W" & ur).Value    '<-----
        End With