Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1392to1396
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Makro nach Doppelklick auf Objekt in Tabelle

Makro nach Doppelklick auf Objekt in Tabelle
28.11.2014 12:42:08
Berny
Hallo,
ich füge in eine Exceltabelle (Matrix) belibig viele Bilder ein. Da die Bilder im Normalgebrauch recht klein sind, möchte ich das gewünschte Bild bei bedarf per Doppelklick vergrößern. Bei Rechtsklick wider auf die Standardgröße zurückändern.
Das vergrößern / verkleinern ist kein Problem.
Ich möchte nicht jedes neue Bild mit meinem Makro verknüpfen. Bei einem einfachen Klick auf ein Objekt darf noch kein Makro ablaufen
Kann man ein Makro auf ein Objekt in einer Tabelle mittels Doppelklick auslösen?
(Worksheet_BeforeDoubleClick wäre ideal funktioniert aber nicht wenn ich auf ein Objekt innerhalb des Worksheet klicke)
M.f.G.
Berny

43
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
mit Image u. Klassenprogrammierung
28.11.2014 15:29:21
Tino
Hallo,
um andere Events wie nur klick zu bekommen müsstest Du jedes Bild
in ein Activ-X Bildsteuerelement (Image) einlesen.
Diese könnte man über Klassenprogrammierung mit diesen Events ausstatten.
Gruß Tino

hier mein Vorschlag
02.12.2014 07:24:39
Tino
Hallo,
hier eine Variante.
Wenn Du dich auf der Tabelle1 befindest, kannst Du Bilder einfügen.
(habe bereits welche reingestellt zum testen)
Nun kannst Du mit der Tastenkompination Strg+Alt+a den Code Erstelle_Image starten,
dieser ersetzt die Bilder durch ein Active-X Image Steuerelement und initialisiert alle um diese mit dem Code im Klassenmodul auszuführen.
(muss nur bei neuen Bildern gemacht werden, daher nach Vorgang sollte gespeichert werden ;-))
Bei doppelklick wird immer um 20% vergrößert (bis zulässige Größe) und bei
Rechtsklick um 20% verkleinert (bis zulässige Größe)
https://www.herber.de/bbs/user/94137.xlsm
Gruß Tino

Anzeige
AW: hier mein Vorschlag
02.12.2014 08:16:36
Berny
Hallo Tino,
ich ziehe meinen Hut vor Dir!!!!!!!!!
Ich habe zwar noch lange keine Ahnung wie das geht (Wird wohl Weihnachten werden) aber es Funktioniert genauso wie ich mir das gewünscht habe.
Ich habe noch 2 Punkte:
Im Modul Image erstellen kommt es bei mit bei dem Schritt
Set oImage = .OLEObjects.Add(ClassType:="Forms.Image.1", _
Left:=oShape.Left, Top:=oShape.Top, _
Width:=oShape.Width, Height:=oShape.Height)
Immer zu der Meldung » Wechsel in Haltemodus zu diesem Zeitpunkt nicht möglich « mit Klick auf Fortfahren geht alles.
Das Modul2 (Code von Nepumuk) wird anscheinend nie aufgerufen (Ich habe bei jedem Modul einen Stoppunkt gesetzt um leichter nachzuvollziehen wann was passiert). Kann es sein, dass das Modul nicht benötigt wird ?
Wie auch immer ich DANKE Dir für Deinen großen Einsatz!!
M.f.G.
Berny

Anzeige
AW: hier mein Vorschlag
02.12.2014 08:34:26
Tino
Hallo,
beim erstellen eines Active-X kann der Code nicht angehalten werden,
hat was mit dem Entwicklungsmodus zu tun!
Sonst werden alle Sub's benötigt!
Gruß Tino

AW: hier mein Vorschlag
02.12.2014 08:28:53
Berny
Hallo Tino,
sorry, meine 2 Punkte haben sich gerade erledigt!
Durch die Bremse im Modul 2 habe ich den Fehler ausgelöst
M.f.G.
Bernhard

Alternativ kannst du auch die Klicks im ...
28.11.2014 22:23:08
Luc:-?
…ausgelösten Makro „zählen“, Berny;
da ein Doppelklick im Prinzip 2 Klicks entspricht, setzt du beim 1.MakroAufruf (mit 1.Klick) eine Static-Variable des Makros auf True und mit dem 2.Klick-Aufruf wieder auf False. Danach kommen die übrigen Befehle, die nur ausgeführt wdn, wenn die Variable False ist.
Damit das einem DoppelKlick näher kommt, kann man auch noch eine Zeitmessung mit einbauen (auch über eine Static-Variable → evtl alles nur über diese), durch die die Variable nur dann wieder False gesetzt wird, wenn der 2.Klick nach weniger als 1,5 sec erfolgt (ggf mal probieren, ob unter 0,5 sec erreichbar ist).
Gruß, Luc :-?
Besser informiert mit …

Anzeige
u. die beliebig vielen Bilder?! oT.
28.11.2014 22:46:50
Tino

Na und?! Dann muss die 'Static'-Variable eben ...
29.11.2014 02:00:15
Luc:-?
…auf genausoviele Werte (dynamisch) dimensioniert wdn oder statt dieser Variablen wird die Klick-Info in den AlternativeText (ggf vorher löschen!) des jeweiligen Objekts geschrieben bzw dort wieder gelöscht… :-]
Luc :-?

u. das soll funktionieren bei beliebig vielen? oT.
29.11.2014 11:14:47
Tino

Ja! owT
29.11.2014 12:23:43
Luc:-?
:-?

braucht doch für jedes eine Sub, ...
29.11.2014 12:44:41
Tino
Hallo,
bei unbekannter Anzahl?!
Glaube ich nicht das dies geht!
Gruß Tino

Wieso, immer das gleiche Pgm, oder wie ...
29.11.2014 13:34:47
Luc:-?
…arbeitest du mit einer Anzahl prinzipiell gleicher, aber unterschiedlich und eindeutig benannter Objekte, bei denen immer das Gleiche gemacht wdn soll, Tino… :->
Luc :-?

lese die Ausgangsfrage! oT.
29.11.2014 14:41:07
Tino

1. Lies! 2. Hab' ich. 3. Welche? Ich sehe nur 1e!
29.11.2014 22:56:06
Luc:-?
Das ist eine Willensbekundung:
Ich möchte nicht jedes neue Bild mit meinem Makro verknüpfen. Bei einem einfachen Klick auf ein Objekt darf noch kein Makro ablaufen.
…und das die einzige Frage:
Kann man ein Makro auf ein Objekt in einer Tabelle mittels Doppelklick auslösen?
Beides scheint in gewisser Weise nicht deckungsgleich zu sein!
Die MakroAufrufe könnten ja auch automatisch auf die Objekte gesetzt wdn. Etwas Vglbares muss ja wohl auch bei deiner Lösung passieren, damit das HptMakro von jedem Objekt ausgelöst wdn kann.
Luc :-?

Anzeige
warten wir ab was Berny schreibt o. nicht oT.
29.11.2014 23:14:08
Tino

AW: warten wir ab was Berny schreibt o. nicht oT.
01.12.2014 14:00:44
Berny
Hallo Luc, Hallo Tino,
zunächst muss ich mich für die späte Antwort entschuldigen. Ich habe einen dU-Arbeitsplatz (dauernd Unterwegs).
ich bin überwältigt bezüglich eurer Diskussion. Leider muss ich zugeben, dass ich deutlich unter eurem Niveau arbeite ;-( Den Trick die Makros (Klicks) zu zählen und nach einer gewissen Zeit wieder zurückzusetzen finde ich genial. Doch wie Tino schon erwähnt hat reicht das noch nicht.(Zumindest verstehe ich das noch nicht.)
Wie weiß ich auf welches Bild geklickt wurde? (Ich will ja nur das Bild vergrößern, welches ich angeklickt habe). Selection.ShapeRange.Name ist leer, weil ja immer noch eine Zelle in der Tabelle aktiv ist.
Wie funktioniert das mit dem Rechtsklick?
Vielleicht muss ich mein Ziel noch einmal präzisieren:
Ich habe eine Matrix, in der in einer Spalte zu jedem Punkt ein Bild eingefügt wird.
Das Bild hat für den schnellen Überblick gerade so die richtige Größe. Wenn ich es genauer brauch muss ich es halt vergrößern.
Nun ist es so das X Mitarbeiter die Tabelle ergänzen und somit neue Bilder einfügen können. Ich will jetzt nicht jedem beibringen wie er ein Bild mit einem Makro verknüpft. (DAU-Sicherheit)
Es gibt viele Möglichkeiten eine Makro zu aktivieren z.B. ShortCut oder Schaltfläche, aber der Doppel- und Rechtsklick ist halt „intuitiv“ und deshalb von den Usern gewünscht.
Wenn es keine Lösung oder nur die Lösung „mit Panzer auf Spatzen schießen“ gibt dann müssen die Kollegen die ShortCuts lenen!
Also Bitte, wenn Ihr eine Lösung habt die ein „normaler Excel User mit Makrokenntnissen“ umsetzen kann mache ich gerne weiter. Wenn nicht Danke ich recht herzlich für eure Mithilfe und belasse meine Matrix wie sie ist.
M.f.G.
Berny

Anzeige
Na dann wdn die potenziellen DAUs wohl auch ...
01.12.2014 14:40:11
Luc:-?
…nur Bilder einfügen wollen und nicht erst ActiveX-Elemente und dann darein die Bilder, Berny;
aber bei beiden Varianten muss etwas ergänzt wdn, was auch eine Automatik erledigen kann. Diese muss nur ausgelöst wdn, was ggf über ein Ereignis, aber auf jeden Fall über einen Button erfolgen kann, der dann nach dem Einfügen zu betätigen wäre (evtl kann auch der XML-XlKopf ergänzt wdn oder ein durch Betätigen einer StandardSchaltfläche (zB Speichern) ausgelöstes Ereignis (Workbook_BeforeSave) dafür genutzt wdn. In letzterem Fall müsste den MAn nur gesagt wdn, dass sie nach dem Einfügen gleich Speichern sollen.
Damit kann ich mich aber erst später beschäftigen.
Gruß, Luc :-?
Besser informiert mit …

Anzeige
AW: Na dann wdn die potenziellen DAUs wohl auch ...
01.12.2014 15:50:29
Berny
Hallo Luc:-?
wie schon gesagt bin ich nicht auf Deinem Niveau. Ich habe zwar schon von ActiveX-Elemente gehört, aber noch nie (zumindest bewusst) damit gearbeitet. Wie ich einen XML-XlKopf ergänze weiß ich auch nicht. Dass ich über ein Ereignis jedem Bild das Makro zuordnen könnte das habe ich mir auch schon überlegt. Nur dann bleiben mir immer noch die 3 Probleme:
Wie verhindere ich dass das Bild gleich beim ersten Klick vergrößert wird? (Hier könnte Dein Vorschlag mit der Static- Variable greifen)
Woher weiß ich welches Bild angeklickt wurde?
Wie mache ich das Bild mit einem Rechstklick wieder klein?
M.f.G.
Berny
PS: Ich weiß das ist unverschämt, aber solltest du dich wirklich noch weiter mit dem Thema beschäftigen, könntest Du mir bitte ein Bsp. anhängen?

Anzeige
BspDatei ist fertig und ...
03.12.2014 05:10:47
Luc:-?
…jetzt auf dem Server abrufbar, Berny (& Tino)!
Morrn, Luc :-?

Falls das DoppelKlick-ähnlicher wdn soll/muss ...
03.12.2014 05:22:44
Luc:-?
…Berny,
sollte am besten die Uhrzeit in den AlternativeText eingetragen wdn (evtl mit KlickZähler als TagesZähler!) und zur KlickzählerErhöhung herangezogen wdn. Bei Abstand zum nächsten Klick > ca 1 sec passiert dann nichts (oder der KlickZähler wird ggf sogar zurückgesetzt → wenn sein Wert 1 ist). Das habe ich (noch) nicht eingebaut!
Luc :-?

AW: Falls das DoppelKlick-ähnlicher wdn soll/muss ...
03.12.2014 08:02:46
Berny
Guten Morgen Luc:-?
Man, man, man ich muss noch vielllll lernen!
Jetzt habe ich gleich zwei Lösungen für ein Problem welches ich (fast) nicht geklaubt habe dass man es lösen kann.
Deine Lösung gefällt mir, Weil der Code überschaubar ist. Die Lösung das Bild nach dem vierten klick wieder zu verkleinern als Ersatz für den rechtsklick finde ich auch nicht schlecht.
Tino’s Lösung entspricht meinem Ausgangswunsch und ist etwas, wie soll ich sagen, „anmutiger“.
Was wie genau funktioniert verstehen ich ehrlich gesagt bei beiden Lösungen (noch) nicht. Deshalb weiß ich auch noch nicht so recht wo ich die Zeitschleife für den Doppelklick einarbeiten muss.
Ich muss mal mit meinen Kollegen reden, was ihnen lieber ist. Vielleicht kann man ja auch auf den Doppelklick verzichten. Wobei das dann bestimmt ein wildes geklicke wird.
Wie auch immer ich DANKE Euch beiden und habe jetzt die Qual der Wahl.
M.f.G.
Berny

Anzeige
Die KlickAnzahl kann durch einfaches Ändern ...
03.12.2014 14:16:05
Luc:-?
…der entsprd Konstante* verringert (bzw auch vergrößert) wdn, Berny,
ebenso wie der Zoom-Faktor. Da beim 1.Klick gar nichts passiert (außer dass der KlickZähler im sh.AlternativeText auf 1 gestellt wird), könnte dieser Schritt bei der ggw Variante auch entfallen, es sei denn, das Bild soll dann markiert wdn (statt mit Rechtsklick). In letzterem Fall wären im Pgm BildZoom die hier blauen Zeilen einzufügen:
    If CBool(KlickZ) Then
ActiveWindow.RangeSelection.Activate
'…bereits vorhandene CodeZeilen
Else: sh.Select
End If
Ein 2.(Zoom-)Klick auf das markierte Bild ist dann solange nicht möglich, wie es markiert ist. Ein Klick auf ein anderes Bild (das dann ggf markiert wird, außer es wird bereits vergrößert/-kleinert) oder eine Zelle hebt die Markierung wieder auf (beim nächsten Klick auf das gleiche Bild wird es aber wie bisher vergrößert!).
* Stattdessen kann auch eine benannte Konstante der Mappe oder des Blattes verwendet wdn, wenn NormalNutzern die Anpassung gestattet wdn soll.
Falls tatsächlich der ZeitAbstand zwischen den Klicks berücksichtigt wdn soll, kann entweder mit vbFkt Now Datum/Zeit (oder Vglb benutzen!) abgefragt und der Wert vor dem Komma durch den KlickZ-Wert ersetzt oder auch stets beide Werte mit Leerzeichen getrennt letztlich in den sh.AlternativeText eingetragen wdn. Ein Leerzeichen zwischen verschiedenen Zahlenwerten stört die IsNumeric-Abfrage nicht, solange die mögliche Ziffernanzahl nicht überschritten und nur ein Wert mit Dezimalen (als letzter!) eingetragen wird. Die Auswertung erfolgt dann über Array-Bildung mittels vbFkt Split und Elemente­Einzel­Abfrage, sowie Differenz­Bildung zwischen gemerktem und aktuellem Zeitwert.
IaR ist es auch günstiger, kein vollständiges Pgm in Ereignisprozeduren (wie hier Workbook_BeforeSave) unter­zu­bringen, sondern unter bestimmten Bedingungen ein separates Pgm auf­zu­rufen. Das habe ich hier aller­dings aus­nahms­weise mal nicht getan, kann ich aber auch ändern.
Die hochgeladene Datei zeigt eine PrinzipLösung, die ich ggf noch ausbauen kann, falls du das (verwenden) willst und nicht selber kannst und meine Zeit das erlaubt (evtl dann wg ZeitAblauf neuen BT einstellen!).
Übrigens, .AlternativeText kann für alles Mögliche genutzt wdn (falls er nicht für Darstellung im Web genutzt wdn soll). Ich habe so u.a. auch schon Farbwechsel eines Shape-Objekts festgehalten…
Gruß, Luc :-?

Anzeige
die Idee ist gut...
03.12.2014 09:03:48
Tino
Hallo,
aber noch sehr fehleranfällig.
Habe einfach vier die vier Bilder aus meinem Beispiel in diese kopiert
Dabei nicht darauf geachtet das jeweils zwei Bilder davon den gleichen Namen haben.
AlternativText eingestellt und einfach ein bar klicks gemacht.
Nun jetzt ist einmal das eine vergrößert wurden und einmal das andere mit dem gleichen Namen.
Gruß Tino

Normalerweise haben einkopierte Bilder ...
03.12.2014 13:10:33
Luc:-?
…unterschiedliche Namen, Tino,
mit Bildern gleichen Namens habe ich das nicht getestet, aber dann ist ggf die sh.ID unterschiedlich. Wenn ich das in meiner BspDatei enthaltene Bild kopiere und nochmals einfüge, tritt der von dir beschriebene Effekt jedenfalls nicht auf.
Gruß, Luc :-?

seltsam bei mir ist dieser Effekt oT.
03.12.2014 13:38:54
Tino

AW: seltsam bei mir ist dieser Effekt oT.
03.12.2014 14:05:40
Berny
Hallo Ihr zwei,
ich mische mich eigentlich ungern ein, da ich ohnehin nicht in eurer Liga spiele, aber ich habe den Effekt auch schon provoziert. Beim Klick auf eines der beiden gleichnamigen Bilder wird einmal dieses und einmal jenes vergrößert/verkleinert.
In einer anderen Datei in der ich auch Bilder verarbeite benutze ich die Möglichkeit mit gleichen Namen für ein Bild um Bilder der gleichen Klasse zu zählen. Aber das ist eine andere Geschichte.
M.f.G.
Berny

ID d.Kopie ist auch automat unterschiedlich! owT
03.12.2014 14:19:08
Luc:-?
:-?

Das gilt auch für Kopien deiner 'Bilder'! owT
03.12.2014 15:42:19
Luc:-?
:-?

die ID ja, der Name ist bei jeder kopie gleich...
03.12.2014 16:14:48
Tino
Hallo,
die ich einfüge u. Caller bezieht sich auf den Namen, daher dieser Effekt.
Gruß Tino

Ja, das ist hier auch nicht anders machbar ...
03.12.2014 17:42:54
Luc:-?
…und ein nachträglicher Vgl mit der ID nutzt dann auch nichts, Tino;
das liegt offensichtl primär am Namen, die Frage ist dann, warum der beim Einkopieren nicht geändert wird. Allerdings wird hier die AW lauten, „weil er kein von Xl vergebener StandardName ist, sondern Nicht-LokalStandard und deshalb von Xl als ein eigener betrachtet wird“, der übrigens noch nie von Xl geändert wurde. Der hat dann Priorität vor dem Standard- bzw InternNamen.
Das müsste man dann wohl schon in der Speicher-EreignisProz abfangen/ändern.
Luc :-?

@Luc, deine Lösung...
02.12.2014 11:46:52
Tino
Hallo,
würde mich auch mal interessieren?!
Weil ich mir noch nicht vorstellen kann, dass dies bei x Bilder sauber funktioniert.
Gruß Tino

Wart's ab hatte noch k.Zeit! owT
02.12.2014 15:16:21
Luc:-?
:-?

ok. oT.
02.12.2014 15:50:00
Tino

warten wir ab was Berny schreibt o. nicht oT.
29.11.2014 23:14:09
Tino

Setze mal hier fort, Folks!
03.12.2014 23:26:51
Luc:-?
Habe mich doch nochmal mit dem Problem befasst und eine Lösung per genereller ID-Hinzufügung zum BildNamen getroffen. Hier die PgmCodes, die in die jeweils angegebenen Module der BspTestDatei einzufügen sind.
DokumentKlassenModul der Mappe: (Alles ersetzen!)
Option Explicit

Rem Achtung! Ruft nur bei aktivem relevanten Blatt d.BildBehdlgsProzedur auf!
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If Me.ActiveSheet.Name = naRelSh Then Run pRufK, True
End Sub
Modul1: (Alles ersetzen!)
Option Explicit

Rem Achtung! Die 1.beiden Konstanten können b.Bedarf geändt wdn!
Public Const zReakt As Double = 1.5, naRelSh$ = "Tabelle1", _
pRufK$ = "BildKontrolle", pRufZ$ = "BildZoom"

Rem Überprüft vor jedem Speichern Bilder auf per Const angegebenem
'   Blatt auf Eintrag v.KlickZähler u.Zoom-MakroAufruf u.nimmt dsn
'   ggf vor; in 1er xlSitzg wdn b.Speichern nur neu hinzugekommene
'   Bilder behandelt, bei 1.Speichern bzw DirektAufruf stets alle.
'   Achtung! BildNamen wdn 1×ig durch _ID-Hinzufüg z.Namen geändt.
'   Vs1.1 -LSr -cD:20141202 -1pub:20141203herber -upD:20141203t
Sub BildKontrolle(Optional ByVal isSaving As Boolean)
Static sn As Long
Dim sx As Long, ws As Worksheet, sh As Shape
If Not isSaving Then sn = 0         'Anm: Nur für Test b.DirektAufruf!
    Set ws = Worksheets(naRelSh)
If CBool(sn) Then sx = sn + 1 Else sx = 1
sn = ws.Shapes.Count
Do Until sx > sn
Set sh = ws.Shapes(sx)
If sh.Type = msoPicture Then
If sh.AlternativeText = "" Or Not IsNumeric(sh.AlternativeText) Then
sh.AlternativeText = "0 " & CStr(zReakt / (24 * 60 ^ 2))
If Mid(sh.Name, InStrRev(sh.Name, "_") + 1)  CStr(sh.ID) Then _
sh.Name = sh.Name & "_" & CStr(sh.ID)
If sh.OnAction = "" Then sh.OnAction = pRufZ
End If
End If
sx = sx + 1
Loop
ex: Set ws = Nothing: Set sh = Nothing
End Sub

Rem Vgrößert normale Bilder in schrittws ab 2.DplKlick m.Klick;
'   ab 1gestelltem letzten Klick (mVal) wdn sie ebso vkleinert;
'   Bild wird b.Vgrößern in VGrd u.b.VKleinern in HGrd gesetzt.
'   B.1.DplKlick wird Bild markiert u.kn n.MarkAufhebg m.nächst
'   DplKlick u.in Folge einf Klick vergrößert->verkleinert wdn;
'   b.markrtm Bild kn 2.DplKlick m.PgmDirektAufruf vmieden wdn.
'   Achtung! B.Bedarf sind nur d.Const-Werte adäquat zu ändern!
'   BildEinstellg relationales SeitenVhältn wird vorausgesetzt!
'   Vs1.1 -LSr -cD:20141202 -1pub:20141203herber -upD:20141203t
Sub BildZoom(Optional ByVal isNoClick As Boolean)
Const mVal As Integer = 4, ZoomFaktor As Single = 1.5
Dim KlickZ As Integer, aktZ As Double, naSh As String, avAlTx, _
ws As Worksheet, sh As Shape
On Error Resume Next
If IsError(Application.Caller) Then isNoClick = True
On Error GoTo fx: aktZ = CDbl(TimeValue(Now))
If Not isNoClick Then
naSh = Application.Caller
ElseIf VarType(Selection) = vbObject Then
naSh = Selection.Name: KlickZ = -100
avAlTx = Array(1, aktZ)
Else: Err.Raise xlErrNA
End If
Set ws = Worksheets(naRelSh): Set sh = ws.Shapes(naSh)
If KlickZ > -100 Then avAlTx = Split(sh.AlternativeText)
KlickZ = CInt(avAlTx(0)): On Abs(KlickZ > 1) GoTo az
If Abs(aktZ - CDbl(avAlTx(1))) 
'    MsgBox sh.AlternativeText, vbInformation, pRufZ & ": " & naSh  'Anm: nur f.Test
fx: If CBool(Err.Number) Then
MsgBox IIf(Err.Number = xlErrNA, "Bitte auf ein Bild (doppel-)klicken!", _
Err.Description), vbCritical, pRufZ & ": F" & CStr(Err.Number)
End If
Set sh = Nothing: Set ws = Nothing
End Sub
Gruß, Luc :-?

schwerer Fehler!
04.12.2014 09:55:22
Tino
Hallo,
jetzt kann ich meine Datei nicht mehr speichern.
Diese Fehlermeldung wird ausgegeben bei Klick auf Weiter wird aber nicht gespeichert!
Userbild
Konnte mir schon denken das dies nicht sauber zum Laufen gebracht werden kann.
Bin jetzt aus der Sache raus.
Gruß Tino

So ein Quatsch, hatte keinerlei Probleme mit ...
04.12.2014 10:21:15
Luc:-?
…dem Pgm, was soll denn da nicht fktionieren! Im Ggteil, dein ProfiVersatzstücke verwendendes Pgm hat bei mir nicht fktioniert! Keinerlei Reaktion! Das kann man auch erwarten, wenn man sich beim Pgmieren nicht auf die eigentl Software beschränkt. Eine auf Windows-Bibliotheken verweisende Declare-Anweisung ist immer auch von der „Gnade“ der Windows-Entwickler abhängig. Sobald die in den betroffenen Bibliotheken etwas ändern, muss ggf auch so ein Pgm geändert wdn. Das setzt ständige ProjektBetreuung durch den Entwickler (was von ProfiPgmierFirmen geleistet wdn kann und wohl auch beabsichtigt ist → KundenBindung!) oder entsprd eigene Kenntnisse, die hier den meisten FrageStellern sicher fehlen, voraus. Ich ziehe meine schlanke und wohlüberlegte Lösung deinem fremdbestückten Sauropoden jedenfalls vor! Ähnliches hatte ich nämlich schon früher gemacht und es hat immer fktioniert (viell hilft ja ein Cancel = True vor und = False nach dem PgmAufruf). Wenn es nicht grdsätzlich fktn würde, hätte ich es auch nicht eingestellt! Viell hat sich aber auch ein Fremdkörper eingeschlichen…?
Aber viell arbeitest du ja mit Xl365, da wäre wohl alles möglich — was man so hört…! Ich habe Xl12/2007 verwendet und kann das bei Gelegenheit auch mit Xl14 testen, denke aber, dass das dann genauso fktioniert. Auf Xl365 werde ich wohl besser verzichten…
Luc :-?

sorry!!!!
04.12.2014 10:36:08
Tino
Hallo,
wird nicht wieder vorkommen das es bei mir nicht sauber funzt ;-)
Werde es meinem Office jetzt sagen das es zu gehen hat! ;-)
Gruß Tino

Typisch! Wer weiß, was für 'Bilder' du hast! owT
04.12.2014 14:38:05
Luc:-?
:-?

Luc, funkt bei mir auch mit Office365 :-) owT
04.12.2014 11:38:35
robert

Danke, robert! Habe mir inzwischen noch eine ...
04.12.2014 14:36:16
Luc:-?
…Verbesserung überlegt, die das Geklicke zwar nicht wesentlich einschränkt (dann generell DoppelKlicks), aber per EinfachKlick aus jedem ZoomStadium zur Ausgangsgröße zurückkehren lässt. Das ist dann allerdings auch der Schwachpunkt im Pgm, denn das hängt natürlich alles von der Mouse-Qualität und der -Fertigkeit des Nutzers ab. Deshalb dürfte es zweckmäßig sein, für die damit zusammenhängenden Konstanten auch noch eine individuelle Alternative über benannte Konstanten der Mappe/des Blattes einzuführen. Die pgminternen Konstanten wdn dann nur wirksam, wenn die vorgegebenen KonstantenNamen fehlen.
Das dann demnächst (wahrscheinlich heute abend/nacht), muss erst mal raus…
Gruß, Luc :-?

So, jetzt noch die letzte Version mit Namen-...
05.12.2014 02:33:27
Luc:-?
…Anwendungsmöglichkeit für bestimmte Konstanten, Leute;
hier die PgmCodes der Version1.2, die die der Version1.1 an gleicher Stelle ersetzen:
DokumentKlassenModul der Mappe: (Alles ersetzen!)
Option Explicit

Rem Achtung! Ruft nur bei aktivem relevanten Blatt d.BildBehdlgsProzedur auf!
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim relShName As String
On Error Resume Next
If IsError(Me.Names(naRindSh).Name) Then relShName = naRelSh _
Else relShName = Evaluate(Me.Names(naRindSh).Value)
On Error GoTo fx
If Me.ActiveSheet.Name = relShName Then Run pRufK, True
fx: If CBool(Err.Number) Then MsgBox Err.Description, vbCritical, "Speichern: F" & Err.Number
End Sub

Modul1: (Alles ersetzen!)
Option Explicit

Rem Achtung! Werte nfolgd Konstanten 1-11 könn b.Bed geändt wdn:
'   1.Konst: max DplKlicks,  2.Konst: ±-ZoomFaktor pro DplKlick,
'   3.Konst: Zoom-KarenzFaktor,  4.Konst: DplKlick-KarenzFaktor,
'   5.Konst: KurzRufZchn f.ZoomPgm (GBn: [[strg][umsch]]+[bst]),
'   6.Konst: StddName relevBlatt,  7.Konst: xlName indiv Konst6,
'   8.Konst: xlName indiv Konst1,  9.Konst: xlName indiv Konst2,
'  10.Konst: xlName indiv Konst3, 11.Konst: xlName indiv Konst4,
'  12.Konst: StddName Vorbereit/KontrPgm, 13.Konst: dto ZoomPgm.
'   Achtung! Indiv xlNamen sind als Namen d.ArbMappe anzulegen!
Public Const modVal As Integer = 4, zoomFakt As Double = 1.5, _
noReakt As Double = 2.5, zoomReakt As Double = 0.8, _
zKey$ = "Z", naRelSh$ = "Tabelle1", naRindSh$ = "relArBl", _
naKindX$ = "DKlickZmax", naZindF$ = "ZoomFaktor", _
naNindReakt$ = "EKlickAbst", naZindReakt$ = "DKlickAbst", _
pRufK$ = "BildKontrolle", pRufZ$ = "BildZoom"
Public mVal As Integer, nReakt As Double, zFakt As Double, zReakt As Double

Rem Überprüft vor jedem Speichern Bilder auf per Const angegebenem
'   Blatt auf Eintrag v.KlickZähler u.Zoom-MakroAufruf u.nimmt dsn
'   ggf vor; in 1er xlSitzg wdn b.Speichern nur neu hinzugekommene
'   Bilder behandelt, bei 1.Speichern bzw DirektAufruf stets alle,
'   wobei auch stets d.PgmOptionen (u.a.KurzRuf) neu angelegt wdn.
'   Achtung! BildNamen wdn 1×ig durch _ID-Hinzufüg z.Namen geändt.
'   Vs1.2 -LSr\CyWorXxl -cD:20141202 -1pub:[1.0]20141203herber -lUpD:20141204t
Sub BildKontrolle(Optional ByVal isSaving As Boolean)
Static sn As Long
Dim sx As Long, ws As Worksheet, sh As Shape
On Error GoTo fx
If Not isSaving Then sn = 0         'Anm: Nur (f.Test) b.DirektAufruf!
    Set ws = ActiveSheet: If CBool(sn) Then sx = sn + 1 Else sx = 1
sn = ws.Shapes.Count
If sx = 1 Then
With Application
.MacroOptions pRufZ, "±-Zoom des doppel" & Chr(31) & _
"geklickten (1.DKlick Markierung) bzw markierten Bildes", , , _
True, zKey, , pRufZ & " bereit"
.MacroOptions pRufK, , , , False, , , pRufK & "-Aufruf"
End With
On Error Resume Next
With ActiveWorkbook.Names
If IsError(.Item(naKindX).Name) Then mVal = modVal _
Else mVal = Evaluate(.Item(naKindX).Value)
If IsError(.Item(naZindF).Name) Then zFakt = zoomFakt _
Else zFakt = Evaluate(.Item(naZindF).Value)
If IsError(.Item(naNindReakt).Name) Then nReakt = noReakt _
Else nReakt = Evaluate(.Item(naNindReakt).Value)
If IsError(.Item(naZindReakt).Name) Then zReakt = zoomReakt _
Else zReakt = Evaluate(.Item(naZindReakt).Value)
End With
On Error GoTo fx
End If
Do Until sx > sn
Set sh = ws.Shapes(sx)
If sh.Type = msoPicture Then
If sh.AlternativeText = "" Or Not IsNumeric(sh.AlternativeText) Then
sh.AlternativeText = "0 " & CStr(zReakt / (24 * 60 ^ 2))
If Mid(sh.Name, InStrRev(sh.Name, "_") + 1)  CStr(sh.ID) Then _
sh.Name = sh.Name & "_" & CStr(sh.ID)
If sh.OnAction = "" Then sh.OnAction = pRufZ
End If
End If
sx = sx + 1
Loop
fx: If CBool(Err.Number) Then _
MsgBox Err.Description, vbCritical, pRufK & ": F" & Err.Number
Set ws = Nothing: Set sh = Nothing
End Sub

Rem Vgrößert normale Bilder schrittws ab 2.DplKlick m.DplKlick;
'   ab 1gestelltem letzten Klick (mVal) wdn sie ebso vkleinert;
'   Bild wird b.Vgrößern in VGrd u.b.VKleinern in HGrd gesetzt;
'   b.1.DplKlick wird Bild markiert u.kann nach MarkAufheben m.
'   nächst DplKlick vgrößert (ab Max vkleinert) bzw m.EinfKlick
'   in jedem Zoom-Stadium ganz rückgesetzt wdn; b.markiert Bild
'   kann statt DplKlick auch Direkt(Kurz-)Ruf [^Z] vwendet wdn.
'   Achtung! B.Bedarf sind nur d.Const-Werte adäquat zu ändern!
'   BildEinstellg relationales SeitenVhältn wird vorausgesetzt!
'   Vs1.2 -LSr\CyWorXxl -cD:20141202 -1pub:[1.0]20141203herber -lUpD:20141204t
Sub BildZoom()
Dim isNoClick As Boolean, KlickZ As Integer, aktZ As Double, _
naSh As String, avAlTx As Variant, ws As Worksheet, sh As Shape
On Error Resume Next: Set ws = ActiveSheet
If IsError(Application.Caller) Then isNoClick = True
On Error GoTo fx: aktZ = CDbl(TimeValue(Now))
If Not isNoClick Then
naSh = Application.Caller
ElseIf VarType(Selection) = vbObject Then
naSh = Selection.Name: KlickZ = 1
Else: Err.Raise xlErrNA
End If
Set sh = ws.Shapes(naSh): avAlTx = Split(sh.AlternativeText)
KlickZ = CInt(avAlTx(0)): KlickZ = KlickZ - CInt(KlickZ = 0 And isNoClick)
On Abs(isNoClick) GoTo az
If Abs(aktZ - CDbl(avAlTx(1)))  nReakt * zReakt / (24 * 60 ^ 2) Then
If CBool((Abs(KlickZ + CInt(Sgn(KlickZ) > 0)))) Then
sh.ZOrder msoSendToBack: KlickZ = Abs(KlickZ) + CInt(KlickZ > 1)
While KlickZ > 0
sh.Height = sh.Height / zFakt: KlickZ = KlickZ - 1
Wend
End If
sh.AlternativeText = "0 " & CStr(aktZ)
Else: sh.AlternativeText = avAlTx(0) & " " & CStr(aktZ)
End If
End If
'    MsgBox sh.AlternativeText, vbInformation, pRufZ & ": " & naSh  'Anm: nur f.Test
fx: If CBool(Err.Number) Then
MsgBox IIf(Err.Number = xlErrNA, "Bitte auf ein Bild (doppel-)klicken!", _
Err.Description), vbCritical, pRufZ & ": F" & CStr(Err.Number)
End If
Set sh = Nothing: Set ws = Nothing
End Sub
Neben Hinzufügung der Anwendbarkeit von Namen zur individuellen Anpassung durch den jeweiligen Nutzer, wurde auch der KlickModus geändert. Der ±-Zoom wird jetzt ab dem 1.DoppelKlick stets durch weitere DoppelKlicks ausgelöst, mit einfachem Klick kann beim Zoomen von jedem Stadium aus gleich zur OriginalGröße zurückgekehrt wdn. Dafür ist mitunter ein ZwischenKlick mit nicht DoppelKlick-relevantem Abstand zum VorKlick erforderlich. Da das etwas schwergängig ist, und evtl auch nicht ganz durch individuelle NutzerKonstanten behoben wird, habe ich noch einen direkten ZoomPgmAufruf per Tastatur-KurzRuf (Shortcut) vorgesehen → ^Z ([[strg][umsch]]+[Z]). Der wirkt sich allerdings auf nur jeweils ein selektiertes Bild aus, dessen Selektierung dann erhalten bleibt! Wenn das Bild in diesem Zustand mit EinfachKlick sofort auf die OriginalGröße zurückgesetzt wdn soll, muss erst die Selektierung aufgehoben wdn, was auch für die Selektierung mit 1.DoppelKlick gilt, bevor weiter doppelgeklickt wdn kann.
Viel Spaß! Morrn, Luc :-?

Ergänzung: Falls die Möglichkeit der indivNamen...
05.12.2014 10:11:39
Luc:-?
…genutzt wdn soll, ist es günstiger, 2 EreignisProzeduren im DokumentKlassenModul der Mappe anzulegen:
Option Explicit

Rem Achtung! Ruft nur bei aktivem relevanten Blatt d.BildBehdlgsProzedur auf!
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
On Error GoTo fx
If Me.ActiveSheet.Name = relShName Then Run pRufK, True
fx: If CBool(Err.Number) Then MsgBox Err.Description, vbCritical, "Speichern: F" & Err.Number
End Sub

Rem Wegen indiv KonstNamenAnlageMöglichkeit erforderlich!
Private Sub Workbook_Open()
On Error Resume Next
If IsError(Me.Names(naRindSh).Name) Then relShName = naRelSh _
Else relShName = Evaluate(Me.Names(naRindSh).Value)
On Error GoTo fx
If Me.ActiveSheet.Name = relShName Then Run pRufK, True
fx: If CBool(Err.Number) Then MsgBox Err.Description, vbCritical, "Speichern: F" & Err.Number
End Sub
Dann muss natürlich auch die Variable relShName bei den GlobalVariablen von Modul1 ergänzt wdn:
Public nReakt As Double, zFakt As Double, zReakt As Double, _
mVal As Integer, relShName As String
Außerdem ist es ggf erwünscht, wenn die Selektierung des per DirektAufruf mit ^Z gezoomten Bildes (nur) bei Rückkehr zur OriginalGröße mit dieser TastenMethode ebenfalls wieder aufgehoben wird. Dafür ist folgd Änderung im Pgm BildZoom erforderlich:
On Abs(isNoClick) GoTo az ändern in …
On (CInt(isNoClick) Imp Abs(Sgn(KlickZ + 1))) + 1 GoTo ax, az
…und dann natürlich die Marke ax: setzen, nämlich an den Anfange der Zeile vor der Marke az:
ax:         ActiveWindow.RangeSelection.Activate
az:         KlickZ = KlickZ Mod mVal

Luc :-?
Besser informiert mit …

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige