Condividi tramite

Drag & Drop con VBA

Anonimo
2015-05-13T06:11:38+00:00

Vorrei sapere se esiste una funzione per fare il drag and drop di oggetti su un foglio excel, nel qual caso vorrei, se possibile, qualche riferimento.

Grazie

Claudio

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

11 risposte

Ordina per: Più utili
  1. Anonimo
    2015-05-16T16:09:23+00:00

    Ciao Maurizio. Come tu hai suggerito ho ripensato al tutto. Ti riporto le mie riflessioni:

    1. Frame Vs UserForm In questo caso non capisco perché costruire un U.F. per acquisire sempre da 2 a 6 dati da riportare sul Foglio. Tra l'altro nell'U.F. dovrei costruire il Frame o un suo equivalente. Questa soluzione mi complicherebbe la vita e aumenterebbe il codice da dover gestire.
    2. Anche il Frame così come l'U.F. sono richiamati da un Bottone.
    3. Quello che non capisco è invece una cosa più concettuale. Mi chiedo perché gli ActiveX mettono a disposizione degli eventi se poi non si riescono a gestire in modo semplice? A cosa mi servono tutti gli eventi di mouse nel Foglio quando possono (ammesso che lo siano, non li ho provati) essere utilizzati solo in una U.F.??? L'utilizzo delle DLL Set/Get CursorPosition renderebbe la vita molto più semplice e il prodotto (programma) più accattivante.
    4. Fare queste riflessioni mi ha indotto a fare delle ricerche su Internet e delle prove, che non ti descrivo - perché richiederebbero troppo tempo - in ogni caso il risultato finale è che gli eventi legati al Mouse e le DLL non si integrano, non danno errore!!!! solo scompaiono gli oggetti ActiveX, da qui il punto 3.
    5. Perché questa mancata interazione? In VB Net esiste. perché non riportarla anche qui? Bho!!!
    6. Egoisticamente parlando credo di aver speso anche troppo tempo a fronte di un problema di pura estetica e che per essere risolto praticamente è sufficiente dare due coordinate per allocare il Frame in una posizione valida.

    Ti allego alcuni riferimenti relativi al problema trattato. Io non sono riuscito a cavarci più di quanto ti ho scritto.  

    RIFERIMENTI:

    GOOGLE: get cursor position excel vba

    FROM: http://www.mrexcel.com/archive/VBA/29549.html

    Re: :-) Come posso ottenere posizione corrente del "cursore"?

    Scritto da Mark O'Brien il 6 Set 2001 02:05

    Se avete bisogno di la posizione del cursore reale e non il postion della cella evidenziata ecco rapido esempio di chiamata GetCursorPos API.

    In primo luogo, creare un modulo utente e aggiungere un pulsante di comando ad esso. Quindi aggiungere il codice al form utente:

    Private Tipo POINTAPI 

    x As Long 

    y As Long 

    Type End

    GetCursorPos Private Declare Function Lib "user32" _ 

    (lpPoint Come POINTAPI) As Long

    Pos fiochi come POINTAPI 'Declare variabile

    Private Sub CommandButton1_Click () 

    GetCursorPos pos 'Avanti Coordinate 

    MsgBox "Cursore Pointer e ':" & vbNewLine _ 

    & "x: =" & pos.x & vbNewLine _ 

    & "y: =" & pos.y 

    End Sub

    Eseguire il form e quando si fa clic sul pulsante ti sarà detto dove si trova il cursore.

    Spero che questo è utile.


    From: http://www.freevbcode.com/ShowCode.asp?ID=2890

    Private Declare Function GetCursorPos Lib "user32" (lpPoint As _

       POINTAPI) As Long

    Private Type POINTAPI

            x As Long

            y As Long

    End Type

    Dim a As POINTAPI

    Dim b As Long

    Dim c As Long

    ' add labels and timer control in the form

    Private Sub Form_Load()

    Timer1.Interval = 1

    End Sub

    Private Sub Timer1_Timer()

       mousepos

    End Sub

    Private Sub mousepos()

    ret = GetCursorPos(a)

    b = a.x

    c = a.y

    Label1.Caption = b

    Label2.Caption = c

    End Sub


    From :https://support.microsoft.com/en-us/kb/152969?wa=wsignin1.0

    Esempio di Set/Get CursorPosition

    Type the following code into a new module:

    ' Access the GetCursorPos function in user32.dll

          Declare Function GetCursorPos Lib "user32" _

          (lpPoint As POINTAPI) As Long

          ' Access the GetCursorPos function in user32.dll

          Declare Function SetCursorPos Lib "user32" _

          (ByVal x As Long, ByVal y As Long) As Long

          ' GetCursorPos requires a variable declared as a custom data type

          ' that will hold two integers, one for x value and one for y value

          Type POINTAPI

             X_Pos As Long

             Y_Pos As Long

          End Type

          ' Main routine to dimension variables, retrieve cursor position,

          ' and display coordinates

          Sub Get_Cursor_Pos()

          ' Dimension the variable that will hold the x and y cursor positions

          Dim Hold As POINTAPI

          ' Place the cursor positions in variable Hold

          GetCursorPos Hold

          ' Display the cursor position coordinates

          MsgBox "X Position is : " & Hold.X_Pos & Chr(10) & _

             "Y Position is : " & Hold.Y_Pos

          End Sub

          ' Routine to set cursor position

          Sub Set_Cursor_Pos()

          ' Looping routine that positions the cursor

             For x = 1 To 480 Step 20

                SetCursorPos x, x

                For y = 1 To 40000: Next

             Next x

          End Sub

    Click anywhere inside the text of the Get_Cursor_Pos routine and press the F5 key to run the Get_Cursor_Pos macro.

    You will get a message box displayed with the coordinates of the current position of the mouse pointer.

    Click anywhere inside the text of the Set_Cursor_Pos routine and press the F5 key to run the Set_Cursor_Pos macro.

    The cursor will move diagonally down across the screen.

    Ciao e grazie, a presto 

    Claudio

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2015-05-15T09:56:59+00:00

    Uhm... Uhm... e Uhm... Io ripenserei il tutto e sostituirei il Frame con uno UserForm. In effetti, a cosa serve avere fra i piedi un Frame che serve solo qualche volta mentre la stessa cosa potresti farla con un Pulsante di comando sul foglio che quando premuto propone lo UserForm necessario? Uno UserForm lo puoi muovere e spostare dove ti pare.

    Quanto alla questione di condividere dati fra UserForm e Foglio di lavoro è, credo, molto più semplice di quel che ti figuri. Basta associare i controlli sullo UserForm alle celle del Foglio di lavoro mediante la proprietà RowSource del controllo e ciò che scrivi nel controllo lo scrivi nella cella associata.

    Dal Foglio di lavoro le Sub non sono accessibili direttamente ma solo per mezzo di altro oggetto, Pulsante di comando ecc.

    Le Function invece, a patto che non compiano azioni, sono accessibili ma devono essere in un Modulo standard di Visual Basic, quindi non in uno UserForm. Conviene spostarle dallo UserForm così saranno accessibili a entrambi.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2015-05-15T06:02:20+00:00

    Ciao Maurizio. Solo ora mi sono accorto della confusione generata dall'accavallarsi delle 

    risposte della quale mi scuso anche perchè involontaria. Sembrandomi corretto tu debba avere tutte le chiarificazioni del caso. Ora provo a spiegare la mia visione.Nel programma che sto costruendo tra i vari Bottoni presenti e che grazie al tuo contributo sono riuscito a implementare esite un bottone che se premuto permetterà di riordinare il Foglio secondo le necessità espresse dall'utente, il tutto dopo aver compilato una sorta di mascherina nella quale specificare i campi scelti e la motalità di riordinamento. In soldoni un Sort su più colonne. Questa mascherina è stata organizzata in un Frame che, ovviamente, appartiene al Foglio e su questo viene presentata e abilitata tramite il Click del Bottone Sort. Il D&D dovrebbe permettere di muovere questa "mascherina" all'interno del Foglio. 

    Ho visto la tua soluzione che si basa sulla creazione di una UserForm nella quale mostri come 

    fare per muovere all'interno di questo gli oggetti in esso contenuti. Io pensavo ad una 

    soluzione differente fatta direttamente sul Foglio interessato utilizzando, se possibile, una 

    funzione quale la GetCursorPosition. Sono quindi andato a cercare in rete l'utilizzo della DLL 

    • (GetcursorPosition) sul Foglio Excel, ma ho potuto vedere che questa viene sempre utilizzata 

    inserendola in una UserForm. Ne deduco che in Excel non è possibile utilizzare in modo diretto 

    la DLL di cui sopra. Dimmi che non è vero, TI PREGO!!!!!.

    Utilizzare una soluzione che si appoggia su una UserForm mi comporta i seguenti problemi dovuti alla mia nulla conoscenza di questo ambiente, più precisamente:

    • Come posso far condividere dati tra Foglio e UserForm
    • Posso dal Foglio utilizzare un Sub/Function sviluppata in UserForm???

    Come spiegato la visione di utilizzo diretto nel Foglio non è solo un fatto estetico/pratico, ma è anche dovuto ai miei limiti.

    Sperando di averti dato tutte le spiegazioni necessarie resto a disposizione per darne ulteriori, se necessario, cosi come posso darti, se lo ritieni utile, i riferimenti sull'utilizzo della GetCursorPosition.

    In attesa di un riscontro, mi scuso ancora per la confusione,involontariamente creata.

    Ciao

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2015-05-13T15:56:31+00:00

    Ciao Maurizio innanzitutto grazie.

    Ho preso visione degli esempi da te sviluppati ed entrambi si appoggiano ad un Form e li ho capiti ma, non espresso, nella mia domanda iniziale era si quanto tu hai fatto ma farlo direttamente sull'Oggetto (Frame) presente sul Foglio. E' possibile?.

    Dovrei provare! ma la tua risposta è fondamentale.

    Io so che gli eventi che devo gestire sono tre:

    • MouseDown per stabilire le coordinate iniziali,
    • MouseMove per conoscere lo spostamento e aggiornare la posizione dell'oggetto
    • MouseUp     per rilasciare il controllo

    Quanto sopra per due motivi:

    • Non so come i due oggetti si parlano, ovvero come faccio a passare le informazioni dal Form al Foglio,       oppure a far eseguire il Sort direttamente dal Form
    • Facendo il D&D direttamente dal Foglio non avrei i problemi di cui sopra e mi sembrerebbe una                 soluzione più lineare. Tutto questo ammesso che le funzioni da te utilizzate siano visibili nel Foglio.

    Se la mia ipotesi non fosse realizzabile non avrei nessun problema a utilizzare quella da te proposta, fatto salvo di capire come faccio a parlare tra loro Form e Foglio.

    Ancora grazie,

    Claudio

    Beati i poveri di spirito perché........

    Bastava guardare gli eventi gestibili sul Frame. (Sciocchino?????? o ?)

    Claudio

    La risposta è stata utile?

    0 commenti Nessun commento
  5. Anonimo
    2015-05-13T15:48:38+00:00

    Sort? Di che sorta di Sort stai parlando?

    La risposta è stata utile?

    0 commenti Nessun commento