Modificare dati da listbox

Anonimo
2019-09-09T08:25:27+00:00

Buongiorno,

spero che possiate aiutarmi con questo nuovo problema.

Ho due file excel (.xlsx e .xlsb) entrambi aperti; io vorrei che nel file .xlsb, in listbox contenuta in una userform, mi caricasse tutti i dati e non l'ultima riga del file .xlsx, sheet1.

Una volta caricati, sono 25 colonne, nella colonna 20 seleziono il dato, lo modifico e la stessa deve avvenire nel file esterno.

La modifica avverrà solo nella colonna 20, nessuna aggiunta e nessuna eliminazione.

Sono 25 colonne perchè devo sapere quale riga sto modificando, ecco perchè ho bisogno della visualizzazione delle colonne.

Grazie mille per ogni suggerimento e a presto,

Sol39

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2019-09-10T14:33:10+00:00

Ciao Sol39,

Norman scusa... ma succede anche a te che i valori nella listbox vengono ripetuti?

Fammi sapere al più presto e grazie mille dell'aiuto!

Per ovviare questo, sostituisci il codice nel modulo di codice della Userform con la seguente versione:

'=========>>

Option Explicit

Dim srcRng As Range

'--------->>

Private Sub UserForm_Initialize()

    Dim srcWB As Workbook

    Dim srcSH As Worksheet

    Dim arrIn As Variant

    Dim LRow As Long

    Const sFile_Sorgente As String = "Sol20190909.xlsx"         '<<=== Modifica

    Const sFoglio_Sorgente As String = "Sheet1"                    '<<=== Modifica

    Set srcWB = Workbooks(sFile_Sorgente)

    Set srcSH = srcWB.Sheets(sFoglio_Sorgente)

    With srcSH

        LRow = LastRow(srcSH, .Columns("A:A"))

        Set srcRng = .Range("A2:T" & LRow)

    End With

    arrIn = srcRng.Value   

    With Me.ListBox1

        .ColumnCount = 25

        .ColumnWidths = _

        "50;50;50;50;50;50;50;50;50;50;50;50;50;50;50;50;50;50;50;50;50;50;50;50;50"

        .List = arrIn

        .TextColumn = 20

    End With

End Sub

'--------->>

Private Sub CommandButton1_Click()

    Dim arrIn As Variant

    Dim arrListBox As Variant

    Dim iRow As Long

    With Me

        iRow = .ListBox1.ListIndex + 1

        srcRng.Cells(iRow, "T").Value = .TextBox2.Text

        arrIn = srcRng.Value

        .ListBox1.List = arrIn

        .TextBox1.Text = .TextBox2.Text

        .TextBox2.Text = vbNullString

    End With

End Sub

'--------->>

Private Sub ListBox1_Change()

    Me.TextBox1.Text = Me.ListBox1.Text

End Sub

'<<=========

===

Regards,

Norman

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2019-09-09T13:38:55+00:00

Ciao Sol39,

spero che possiate aiutarmi con questo nuovo problema.

Ho due file excel (.xlsx e .xlsb) entrambi aperti; io vorrei che nel file .xlsb, in listbox contenuta in una userform, mi caricasse tutti i dati e non l'ultima riga del file .xlsx, sheet1.

Una volta caricati, sono 25 colonne, nella colonna 20 seleziono il dato, lo modifico e la stessa deve avvenire nel file esterno.

La modifica avverrà solo nella colonna 20, nessuna aggiunta e nessuna eliminazione.

Sono 25 colonne perchè devo sapere quale riga sto modificando, ecco perchè ho bisogno della visualizzazione delle colonne.

Grazie mille per ogni suggerimento e a presto,

Prova qualcosa del genere:

In un modulo standard, incolla il seguente codice:

'=========>>

Option Explicit

'--------->>

Public Sub Tester()

    UserForm1.Show vbModeless

End Sub

'--------->>

Public Function LastRow(SH As Worksheet, _

                        Optional rng As Range, _

                        Optional minRow As Long = 1, _

                        Optional sPassword As String)

    Dim bProtected As Boolean

    With SH

        If rng Is Nothing Then

            Set rng = .Cells

        End If

        bProtected = .ProtectContents = True

        If bProtected Then

            Application.ScreenUpdating = False

            .Unprotect Password:=sPassword

        End If

    End With

    On Error Resume Next

    LastRow = rng.Find(What:="*", _

                       after:=rng.Cells(1), _

                       Lookat:=xlPart, _

                       LookIn:=xlFormulas, _

                       SearchOrder:=xlByRows, _

                       SearchDirection:=xlPrevious, _

                       MatchCase:=False).Row

    On Error GoTo 0

    If LastRow < minRow Then

        LastRow = minRow

    End If

    If bProtected Then

        SH.Protect Password:=sPassword, _

                   UserInterfaceOnly:=True

    End If

    Application.ScreenUpdating = True

End Function

'<<=========

Nel modulo di codice della tua Userfoem, incolla:

'=========>>

Option Explicit

Dim srcRng As Range

'--------->>

Private Sub UserForm_Initialize()

    Dim srcWB As Workbook

    Dim srcSH As Worksheet

    Dim arrIn As Variant, arrListBox As Variant

    Dim LRow As Long

    Const sFile_Sorgente As String = "Sol20190909.xlsx"             '<<=== Modifica

    Const sFoglio_Sorgente As String = "Sheet1"                          '<<=== Modifica

    Set srcWB = Workbooks(sFile_Sorgente)

    Set srcSH = srcWB.Sheets(sFoglio_Sorgente)

    With srcSH

        LRow = LastRow(srcSH, .Columns("A:A"))

        Set srcRng = .Range("A2:T" & LRow)

    End With

    arrIn = srcRng.Value

    arrListBox = Application.Index(arrIn, [Row(1:100)], Array(20, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1, 18, 19, 21, 22, 23, 24, 25))

    With Me.ListBox1

        .ColumnCount = 25

        .ColumnWidths = _

              "50;50;50;50;50;50;50;50;50;50;50;50;50;50;50;50;50;50;50;50;50;50;50;50;50"

        .List = arrListBox

        .TextColumn = 1

    End With

End Sub

'--------->>

Private Sub CommandButton1_Click()

    Dim iRow As Long

    iRow = Me.ListBox1.ListIndex + 1

    srcRng.Cells(iRow, "T").Value = Me.TextBox2.Text

End Sub

'--------->>

Private Sub ListBox1_Change()

    Me.TextBox1.Text = Me.ListBox1.Text

End Sub

'<<=========

Potresti scaricare i miedi file di prova Sol20190909.xlsb e Sol20190909.xlsx

Con questo approccio, i dati della colonna T vengono visualizzati nella prima colonna della ListBox e TextBox1 visualizza il valore della colonna T della riga selezionata della ListBox. Premendo il CommandButton, il valore corrispondente della colonna T del foglio di origine viene sostituito con il valore che viene inserito nel controllo TextBox2.

===

Regards,

Norman

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

12 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2019-09-10T09:23:07+00:00

    Ciao Sol39,

    Norman, scusami ho finito di abbozzare il codice a cui stavo lavorando:

    il codice di seguito è presente nel pulsante che mi visualizza gli ultimi dati (lo trovo fattibile per me)

    Dim wbFrom As Workbook, wbTo As Workbook, wkFrom As Worksheet

    Dim Righe As Long, Colonne As Long, r As Long, c As Long, arrLstBox() As Variant

    Dim rng As Range

    Set wbFrom = Workbooks("File2.xlsx")

    Set wbTo = ThisWorkbook

    Set wkFrom = wbFrom.Sheets("Sheet1")

    With wkFrom.Range("A1").CurrentRegion

      Righe = .Rows.Count - 1

      Colonne = .Columns.Count

      Set rng = .Offset(1, 0).Resize(Righe, Colonne)

    End With

    Righe = wkFrom.Range("A1").CurrentRegion.Rows.Count - 1

    Colonne = wkFrom.Range("A1").CurrentRegion.Columns.Count

    Me.ListBox1.ColumnCount = 5

    ReDim arrLstBox(1 To Righe, 1 To Colonne)

    For r = 1 To Righe

      For c = 1 To Colonne

        arrLstBox(r, c) = wkFrom.Cells(r + 1, c)

      Next c

    Next r

    Me.ListBox1.List() = (arrLstBox)

    Invece questo mi visualizza nella textbox1 il valore che andrò a modificare:

    TextBox1.Text = ListBox1.List(ListBox1.ListIndex, 3)

    (evento doppio click della listbox)

    Ho un altro pulsante dove vorrei che ci fosse il codice per la modifica..

    Solo che sto facendo un po di confusione. Mi aiuteresti per favore?

    Come funziona: clicco sul pulsante1 e nella listbox mi escono tutti i dati del foglio esterno (esempio delle 5 colonne secondo post), doppio click sulla riga dove andrò a modificare il dato (colonna D) e nella textbox esce il valore desiderato..poi qui vorrei modificare sempre nella textbox in cui esce il vecchio valore con un nuovo valore, click sul secondo pulsante e il nuovo valore esce sia nella listbox sia nel file esterno.

    Scusami per averti fatto perdere tempo e grazie,

    Ho aggiornato il miei file di prova che ora funzionano nel seguente modo:

    • Facendo clic su una riga qualsiasi nella ListBox, il valore della colonna 20 di quella riga viene visualizzato nella prima TextBox.
    • L'utente inserisce il valore di sostituzione nella seconda TextBox
    • Quando si preme il CommandButton, il foglio esterno viene aggiornato con il testo di sostituzione, la ListBox viene aggiornata, la seconda TextBox viene cancellata e il testo rivisto viene visualizzato nella prima TextBox.

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2019-09-10T07:42:43+00:00

    Buongiorno,

    qui potete trovare il link ai file: https://we.tl/t-FV0J0fPq3l

    Spiego come funziona: aprite entrambi i file, in File1 è presente l'userform, cliccate sul pulsante visualizza e la listbox viene caricata con i dati presenti in File2, doppio click sulla riga scelta per modificare il quarto dato, il dato da modificare viene viualizzato nella textbox e qui vorrei modificare il dato direttamente in txt1 poi cliccando su commandbutton2 (il codice presente mi modifica tutti i dati della colonna D e non solo la riga selezionata) mi modifica il dato della riga selezionata.

    La modifica vorrei che avvenisse in contemporanea su listbox e File2, non voglio ricaricarla per vedere le modifiche.

    Grazie mille dell'aiuto e buona continuazione :)

    Sol39

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2019-09-09T23:17:43+00:00

    Buonasera ,

    capisco la tua difficoltà nell'eseguire quello che hai specificato, cerchiamo quindi di risolvere il problema ma ci devi aiutare,

    per farlo abbiamo bisogno di maggiori informazioni, non conosciamo la tipologia di dati, in questi casi è buona norma pubblicare un file di esempio esente di dati sensibili caricandolo per esempio su www.filedropper.com oppure condividendolo tramite onedrive, dato che quanto esposto e' molto confusionario.

    Aspettiamo maggior info per poterti dare la soluzione corretta in tempi brevi!

    Saluti,

    Daniele

    La risposta è stata utile?

    0 commenti Nessun commento