04 settembre, 2007

Gestione della clipboard con Excel VBA

Al contrario del post precedente, possiamo notare come viene gestita la clipboard dal VBA di excel:
Set mydata = New DataObject
mydata.SetText STRINGA
mydata.PutInClipboard
Naturalmente, è necessario che siano abilitati i riferimenti, andando su strumenti -> riferimenti e flaggando dove necessario, nel caso io ho flaggato:
Visual Basic For Application
Microsoft Excel 11.0 Object Library
OLE Automation
Microsoft Office 11.0 Object Library
Microsoft Forms 2.0 Object Library
Microsoft ActiveX Data Objects 2.7 Object Library

Gestione della clipboard con Access VBA

Mi sono trovato ultimamente ad utilizzare access per un piccolo progetto e, nel momento del debug,mi sono reso conto che il vba access non ha una gestione della clipboard. A cosa potrà servire la clipboard se hai a disposizione un database, direte voi. Certo la domanda è legittima, ed in effetti si può anche evitare di usarle,inserendo i valori necessari all'interno di una cella, ma per questioni di praticità,efficienza e velocità, mi sono reso conto che la maniera più comoda di gestire il debug del sql di access è proprio la copia della stringa contenente il sql nella clipboard. Cmq poco importa a cosa possa servire questa funzionalità, l'importante è sapere che si può fare e come sono le modalità per farlo.
Per prima cosa dobbiamo creare un nuovo modulo, anche dalla finestra oggetti, e successivamente inserire questo codice che io sinceramente non ho nemmeno letto:
Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) _
As Long
Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) _
As Long
Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, _
ByVal dwBytes As Long) As Long
Declare Function CloseClipboard Lib "User32" () As Long
Declare Function OpenClipboard Lib "User32" (ByVal hwnd As Long) _
As Long
Declare Function EmptyClipboard Lib "User32" () As Long
Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, _
ByVal lpString2 As Any) As Long
Declare Function SetClipboardData Lib "User32" (ByVal wFormat _
As Long, ByVal hMem As Long) As Long

Public Const GHND = &H42
Public Const CF_TEXT = 1
Public Const MAXSIZE = 4096

Function ClipBoard_SetData(MyString As String)
Dim hGlobalMemory As Long, lpGlobalMemory As Long
Dim hClipMemory As Long, X As Long

' Allocate moveable global memory.
'-------------------------------------------
hGlobalMemory = GlobalAlloc(GHND, Len(MyString) + 1)

' Lock the block to get a far pointer
' to this memory.
lpGlobalMemory = GlobalLock(hGlobalMemory)

' Copy the string to this global memory.
lpGlobalMemory = lstrcpy(lpGlobalMemory, MyString)

' Unlock the memory.
If GlobalUnlock(hGlobalMemory) <> 0 Then
MsgBox "Could not unlock memory location. Copy aborted."
GoTo OutOfHere2
End If

' Open the Clipboard to copy data to.
If OpenClipboard(0&) = 0 Then
MsgBox "Could not open the Clipboard. Copy aborted."
Exit Function
End If

' Clear the Clipboard.
X = EmptyClipboard()

' Copy the data to the Clipboard.
hClipMemory = SetClipboardData(CF_TEXT, hGlobalMemory)

OutOfHere2:

If CloseClipboard() = 0 Then
MsgBox "Could not close Clipboard."
End If

End Function
Il tutto al di sotto della scritta Option Compare Database.
Fatto questo nel codice della nostra form dovremmo scrivere:
ClipBoard_SetData STRINGA

dove STRINGA è il nome della variabile di tipo String che contiene il nostro sql.
Fatto questo basterà creare una query farlocca nel quale inserire di volta in volta il sql presente nella clipboard cliccando il nostro ben conosciuto ctrl+v.

Ciao sono Diego mi presento

Ciao sono Diego mi presento piacere Diego. Sono un programmatore, il linguaggio che uso in maniera specifica è il PLSQL, ma spesso mi ritrovo ad usare altri linguaggi e programmi come VBA o Java, e dato che mi trovo a volte in situazioni difficili, dal punto di vista della programmazione, e che riesco con gran fatica, solamente attraverso ricerche magari di giorni sul web o su libri di programmazione, a risolvere, apro questo blog per condividere alcune soluzioni che ho trovato e che per alcuni potranno sembrare banali ma che per altri possono richiedere parecchio tempo per essere risolti. Magari invece uno viene qui trova la soluzione ai soui problemi,anzichè dover girare per forum o gruppi per ore arrabattandosi con pezzi di codice qui e pezzi di codice li. Oltre a problemi di programmazione indicherò alcuni programmi utili magari sotto windows o sotto linux così che se qualcuno ha problemi può usare quelli per risolverli.
Ciao ci sentiamo presto.