Condividi tramite

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-09T14:02:31+00:00

    Ciao Norman,

    grazie per aver risposto.

    Il codice va benissimo solo che nel momento in cui modifico il dato mi piacerebbe vedere la modifica anche nella listbox e non ricaricarla nuovamente.

    Gentilissimo come sempre..

    Saluti,

    Sol39

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2019-09-09T10:45:26+00:00

    Ciao Sara,

    grazie per aver risposto.

    Ti allego immagine della tabella.

    P.S. il primo post è a riferimento del mio file originale che non posso postare che ha 25 colonne, invece questa tabella contiene 5 colonne in quanto file di esempio.

    Nella listbox vorrei che uscissero tutti i dati, in questo caso due righe:

    prova prova2 prova3 prova4 prova5

    ciao1 ciao2     ciao3   ciao4   ciao5

    (nella listbox uscirà così)

    io seleziono la prima riga, poi tramite messaggio mi visualizza il contenuto della colonna D (prova4), la modifico, pulsante per confermare e il nuovo valore prende il posto del vecchio valore.

    Grazie per il supporto,

    Sol39

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2019-09-09T10:25:52+00:00

    Buongiorno,

    Benvenuto nella community Microsoft.

    Mi chiamo Sara, sono una consulente indipendente e sono qui per aiutarti.

    Per cercare di capire meglio il problema, è possibile aggiungere una schermata di stampa/ istantanea della tabella?

    Cordialmente 

    Sara

    La risposta è stata utile?

    0 commenti Nessun commento