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-09T17:13:08+00:00

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

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

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2019-09-09T15:09:49+00:00

    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,

    Sol39

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2019-09-09T14:15:40+00:00

    Ciao Sol39**,**

    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.

    Allora, sostituisci la mia procedura CommandButton1_Click con la seguente versione in cui le modifiche sono evidenziate in grassetto:

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

    Private Sub CommandButton1_Click()

    Dim arrin As Variant

    Dim arrListBox As Variant

        Dim iRow As Long

        iRow = Me.ListBox1.ListIndex + 1

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

    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))

    Me.ListBox1.List = arrListBox

    End Sub

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

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento