Klembord wordt gewist

Status
Niet open voor verdere reacties.

willema

Gebruiker
Lid geworden
26 aug 2005
Berichten
320
Beste,

Ik werk al een tijdje met een zelfgemaakt xlsm-bestand met heel wat code.
Eén van de procedures selecteert op een specifiek werkblad een bereik en zet die in het geheugen (Copy).
De gebruiker kan dan een ander xlsx-bestand (zonder VBA) activeren, een cel selecteren en met Ctrl+V de selectie plakken.

Dat heeft altijd goed gewerkt.

Nu heb ik in dat xlsm-bestand -om een ander probleem op te lossen bij het wisselen tussen bestanden- een extra sub moeten schrijven die wordt uitgevoerd bij (ThisWorkbook_Deactivate).
Dit is de code:

Code:
Private Sub Workbook_Deactivate()
    
    On Error GoTo Err_0063
    
    'drag en drop inschakelen
    Application.CellDragAndDrop = True
    
    'events inschakelen
    Application.EnableEvents = True
    
    'shortcuts terugzetten
    Application.OnKey "+^A"
    Application.OnKey "+^B"
    Application.OnKey "+^C"
    Application.OnKey "+^D"
    Application.OnKey "+^H"
    
Exit_0063:
    Exit Sub

Err_0063:
    MsgBox "Foutcode 0063/" & Right(vs, Len(vs) - 1), vbCritical, "Basissjabloon v" & vs
    Application.EnableEvents = True
    Resume Exit_0063
    
End Sub

Nu is dat ander probleem inderdaad opgelost, maar blijkt bij uitvoeren van deze code dat meteen ook het klembord wordt gewist, waardoor er niets meer te plakken valt.
Ik heb getest: als ik bovenstaande code tijdelijk verwijder is plakken terug mogelijk.

Hoe kan ik dit oplossen zonder die code te moeten weggooien want ze is nodig, zoals jullie zien, om wat sneltoetsen terug goed te zetten en om EnableEvents en CellDragAndDrop terug juist te zetten bij het schakelen naar een ander geopend bestand.
 
Je kunt de code een ander werkboek laten openen en daarin deze gewenste gegevens zetten voordat de gebeurtenis 'deactivate' wordt uitgevoerd.
 
Hey snb,

de code opent geen ander werkboek omdat elke gebruiker van de basis een eigen (doel-)werkboek heeft, maakt of kiest (van zolang het maar een xlsx is).

Wat doet de code wel:
Als in de basis een bepaald werkblad wordt geactiveerd wordt aan de hand van een aantal variabelen een bereik geselecteerd. En dat bereik wordt gekopieerd.
Als de gebruiker nu zijn eigen werkboek opent/activeert, een werkblad en een eerste cel kiest dan kan hij door te plakken meteen de inhoud van het bereik zetten waar hij dat zelf wil.

En dat werkte altijd goed.

Maar nu maakt bovenstaande code echter het klembord leeg, waardoor er na het activeren van het persoonlijk werkboek (en dus het deactiveren van de basis) niets meer te plakken is.
En dat vroeg ik me af, hoe dat kwam.
Welke actie in bovenstaande procedure zorgt er voor dat het klembord wordt gewist ?

Heeft het iets te maken met het ontbreken van CutCopyMode ?
 
Dat is een heel andere vraag dan in #1.
 
Oei sorry, dan heb ik het de eerste keer niet zo goed omschreven. Ik bedoel in elk geval nog altijd hetzelfde :-)

Ik stuur je per email het bestand op van zodra eens achter mijn PC (ipv iPad).
 
Laatst bewerkt:
Code:
Application.CellDragAndDrop = True
zorgt ervoor dat het klembord gewist wordt.
 
Hey alphamax,

inderdaad je hebt gelijk! Als ik die regel even verwijder dan is het klembord er nog en kan er geplakt worden.
Maar nu is de vraag: wat is een workaround ?
In het basisdocument mag er NIET worden gesleept/neergezet, dus in Workbook_Activate staat Application.CellDragAndDrop = False
Maar in het target-document mag er eventueel WEL worden gesleept/neergezet, dus in Workbook_Deactivate (van het basis-document) staat Application.CellDragAndDrop = True
Is de combinatie van Copy/Paste en CellDragAndDrop= True/False bij het wisselen tussen bestanden dan altijd onmogelijk ??? En zoja, wat is de logica hier achter ?

Ik heb nu zelf een halfslachtige workaround: Ik zet Application.CellDragAndDrop = True niet langer bij Workbook_Deactivate maar wel bij Workbook_BeforeClose:
Copy/Paste is nu terug mogelijk en wie vervolgens in het target-document wil gaan slepen/neerzetten moet het basis-document dan eerst tijdelijk sluiten.
Dat werkt, maar niet alle gebruikers gaan het verband leggen tussen beide ("Hey, ik kan niet slepen. Ik zal het eerste document even sluiten.")

Forumleden die een betere workaround kunnen verzinnen zijn :thumb::thumb::thumb::thumb::thumb::thumb:
 
Ik vind dat je als een prins van Serendip wel een prachtige methode hebt aangedragen om het klembord leeg te maken... ;)
 
Serendipiteit: slimme, voorbereide mensen zijn beter in staat om daadwerkelijk ontdekkingen te doen aan de hand van het toeval.
 
Je kan ook in het basisbestand een export button maken die de berekende range pusht naar het andere bestand dat open staat.

Wat is nu het grondprobleem? ik heb het idee dat er meerdere makkelijkere oplossingen zijn dan je blind staren op het klembord.
Kan je enkele voorbeeldbestandjes plaatsen.
 
@Willema

Ik vind het niet vreemd dat de wijziging van een instelling in de User Interface die betrekking heeft op de manier van kopiëren, het hulpmoiddel bij uitstek bij iedere kopieeraktie, het klembord, voor alle zekerhjeoid gereset wordt. Anders zou het mogelijk zijn dat na drag&drop = false alsnog wat zich in het klembord bevindt ergens heen gesleept zou kunnen worden.
Het lijkt me daarom beter niet van de User Interface van Excel (met zijn vele beperkingen en eigenaardigheden) gebruik te maken maar van een userform.
 
Hey alphamax,

Het basisbestand is nogal complex, maar ik zal het eerst een beetje uitkleden en het dan hier posten.
Wordt vervolgd...
 
Hey snb,

als je het zo schrijft is het inderdaad logisch.
Userforms, daar moet ik nog mee leren werken (staat op de goedgevulde agenda).
Dit project (waarvan je een kopie kreeg) loopt ondertussen perfect op dit detail na. Ik ga (heb ook niet de tijd) dit voorlopig zo verder laten bollen.
Maar nieuwe projecten start ik met kennis van userforms. Beloofd :-)
 
Gerelateerde vraag: bestaat er binnen Excel VBA een manier om het gehele geselecteerde bereik inclusief opmaak in het geheugen op te slaan ?
Een array onthoudt alleen de waarden in dat bereik, niet ?
 
als je in je code inbouwt dat de gebruiker een bestand kan selecteren/openen waarin de gegevens terecht moeten komen kun je de gegevens uit het bronbestand gewoon kopiëren (zelfs zonder tussenkomst van de gebruiker). daarna kan dan het bronbestand verlaten worden (en de drag&drop optie ingeschakeld) om in het doelbestand verder te werken.

Bijv

Code:
Sub M_snb()
   '   .....

  With Application.FileDialog(3)
    .Filters.Add "Excel bestadnen", "*.xlsx"
    If .Show = -1 Then 
       with Workbooks.Open .SelectedItems(1)
        thisworkbook.sheets(1).cells(1).currentregion.copy .sheets(1).cells(rows.count,1).end(xlup).offset(2)
      end with
   end if
  end with
end sub
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan