26.12.2010

Lupe - Label - Klassenprogrammierung!

Mal wieder nachgefragt: Wie kann man eine Art Lupe programmieren, die bei Wechsel der Zelle den Inhalt vergrößert darstellt? Beim verlassen der Zelle wieder Urzustand. Das Ganze jederzeit Ein- bzw. Ausschaltbar. Habe mal einen alten Code ausgegraben:

Lupe - Label - Klassenprogrammierung...[ZIP, 60 KB]

Code in "DieseArbeitsmappe":

Option Explicit
Private Sub Workbook_Open()
Application.OnKey "{F3}", "Application_Ereignis.An"
Application.OnKey "{F4}", "Application_Ereignis.Aus"
Call An
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.OnKey "{F3}"
Application.OnKey "{F4}"
Call Aus
End Sub



Code in ein Modul mit Namen "Application_Ereignis":

Option Explicit
Dim AppObject As New clsDatei
Public Sub An()
Set AppObject.AppLiCa = Application
End Sub
Public Sub Aus()
Dim objOLEObject As OLEObject
If Workbooks.Count < 1 Then Exit Sub
For Each objOLEObject In ActiveSheet.OLEObjects
If TypeOf objOLEObject.Object Is MSForms.Label Then
If objOLEObject.Name = "Lupe" Then objOLEObject.Delete
Exit For
End If
Next
Dim oS As Shape
Set AppObject.AppLiCa = Nothing
End Sub



Code in ein Klassenmodul mit Namen "clsDatei":

Option Explicit
Public WithEvents AppLiCa As Application
Private Sub AppLiCa_SheetSelectionChange(ByVal Sh As Object, _
ByVal Target As Range)
Dim objOLEObject As OLEObject
Dim intBerechnen As Integer
Dim objLabel As Object
If Target.Count > 2 Then Exit Sub
With Application
intBerechnen = .Calculation
.Calculation = -4135
End With
If Target.Value <> "" Then
For Each objOLEObject In Sh.OLEObjects
If TypeOf objOLEObject.Object Is MSForms.Label Then
If objOLEObject.Name = "Lupe" Then objOLEObject.Delete
Exit For
End If
Next
Set objLabel = Sh.OLEObjects.Add(ClassType:="Forms.Label.1", _
Left:=Target.Left, Top:=Target.Top, _
Width:=Target.Width * 2, Height:=Target.Height * 2)
objLabel.Name = "Lupe"
With objLabel.Object
.Caption = Target.Value
.Font.Size = 20
.TextAlign = 2
.ForeColor = Target.Font.Color
.BackColor = Target.Interior.Color
End With
Else
For Each objOLEObject In Sh.OLEObjects
If TypeOf objOLEObject.Object Is MSForms.Label Then
If objOLEObject.Name = "Lupe" Then objOLEObject.Delete
Exit For
End If
Next
End If
Set objLabel = Nothing
Application.Calculation = intBerechnen
End Sub

20.12.2010

Office - Applikationen - gestartet!

Über eine Funktion soll geprüft werden ob eine der Officeapplikationen gestartet ist. Ist die Applikation geöffnet soll sie nicht geschlossen werden, sonst schon. Die "Sichtbarkeit" der Applikation wird über eine optionale Variable gesteuert.

Für PowerPoint muss eventuell auch folgendes beachtet werden:
http://vbanet.blogspot.com/2010/09/excel-powerpoint.html

Option Explicit
Dim blnTMP As Boolean
Public Sub Test()
Dim objApp As Object
On Error GoTo Fin
Set objApp = OffApp("Word")
'Set objApp = OffApp("Word", False)
'Set objApp = OffApp("Outlook")
'Set objApp = OffApp("Outlook", False)
'Set objApp = OffApp("PowerPoint")
'Set objApp = OffApp("PowerPoint, False")
'Set objApp = OffApp("ACCESS")
'Set objApp = OffApp("ACCESS", False)
If Not objApp Is Nothing Then
MsgBox objApp.Name & " Version: " & objApp.Version
Else
MsgBox "Applikation nicht installiert!"
End If
Fin:
If Not objApp Is Nothing Then
If blnTMP = True Then
objApp.Quit
blnTMP = False
End If
End If
Set objApp = Nothing
If Err.Number <> 0 Then MsgBox "Fehler: " & _
Err.Number & " " & Err.Description
End Sub
Private Function OffApp(ByVal strApp As String, _
Optional blnVisible As Boolean = True) As Object
Dim objApp As Object
On Error Resume Next
Set objApp = GetObject(, strApp & ".Application")
Select Case Err.Number
Case 429
Err.Clear
Set objApp = CreateObject(strApp & ".Application")
blnTMP = True
If blnVisible = True Then
On Error Resume Next
objApp.Visible = True
Err.Clear
End If
End Select
On Error GoTo 0
Set OffApp = objApp
Set objApp = Nothing
End Function

14.12.2010

Word - Fußzeile - Seiten - Datum - Autor!

Ein neues Worddokument soll erstellt bzw. ein vorhandenes Dokument geöffnet und in die Fußzeile folgendes eingegeben werden: "Seite ? von ?", "Datum" und "Autor" - erstellt und getestet in Excel 2010:

Option Explicit
Public Sub Test()
Dim objFooter As Object
Dim objWDApp As Object
Dim objWDDoc As Object
Dim objRange As Object
On Error GoTo Fin
Set objWDApp = OffApp("Word")
If Not objWDApp Is Nothing Then
'Set objWDDoc = objWDApp.Documents.Open("C:\Temp\Dok1.doc")
Set objWDDoc = objWDApp.Documents.Add
Set objFooter = objWDDoc.Sections(1).Footers(1)
With objFooter.Range
Set objRange = .Characters(Len(objFooter.Range.Text))
objFooter.Range.Text = "Seite "
Set objRange = .Characters(Len(objFooter.Range.Text))
objRange.Fields.Add objRange, -1, "PAGE"
Set objRange = .Characters(Len(objFooter.Range.Text))
objRange.Text = " von "
Set objRange = .Characters(Len(objFooter.Range.Text))
objRange.Fields.Add objRange, -1, "NUMPAGES"
Set objRange = .Characters(Len(objFooter.Range.Text))
objRange.Text = vbTab
Set objRange = .Characters(Len(objFooter.Range.Text))
objRange.InsertDateTime DateTimeFormat:="dd.MM.yyyy"
Set objRange = .Characters(Len(objFooter.Range.Text))
objRange.Text = vbTab
Set objRange = .Characters(Len(objFooter.Range.Text))
objRange.Fields.Add objRange, -1, "AUTHOR"
End With
End If
Fin:
Set objRange = Nothing
Set objFooter = Nothing
Set objWDDoc = Nothing
Set objWDApp = Nothing
If Err.Number <> 0 Then MsgBox "Fehler: " & _
Err.Number & " " & Err.Description
End Sub
Private Function OffApp(ByVal strApp As String) As Object
Dim objApp As Object
On Error Resume Next
Set objApp = GetObject(, strApp & ".Application")
Select Case Err.Number
Case 429
Err.Clear
Set objApp = CreateObject(strApp & ".Application")
objApp.Visible = True
If Err.Number > 0 Then
MsgBox Err.Number & " " & Err.Description
Set objApp = Nothing
End If
Case 0
Case Else
MsgBox Err.Number & " " & Err.Description
Set objApp = Nothing
End Select
On Error GoTo 0
Set OffApp = objApp
Set objApp = Nothing
End Function

23.11.2010

Liste in Excel - Seiten in Word löschen!

Frage: Wie lösche ich korrespondierende Seiten in einem Worddokument, wenn in einer Excelliste in Spalte B kein "X" steht (Exceldatei und Worddokument müssen im selben Ordner sein)? Das abgespeckte Worddokument wird dann unter dem Namen "Test_" plus einer Zufallszahl im gleichen Ordner wie die Exceldatei abgespeichert.

Seiten in Worddatei löschen - Vorgaben aus Excel...[ZIP, 60 KB]

Option Explicit
Dim objWD As Object
Public Sub Test()
On Error Resume Next
Set objWD = GetObject(, "Word.Application")
Select Case Err.Number
Case 429
Err.Clear
Set objWD = CreateObject("Word.Application")
If Err.Number > 0 Then
MsgBox Err.Number & " " & Err.Description
Set objWD = Nothing
Exit Sub
End If
Case 0
Case Else
MsgBox Err.Number & " " & Err.Description
Set objWD = Nothing
Exit Sub
End Select
On Error GoTo 0
On Error GoTo Fin
Call Write_Word
Fin:
Set objWD = Nothing
If Err.Number <> 0 Then MsgBox "Fehler: " & _
Err.Number & " " & Err.Description
End Sub
Private Sub Write_Word()
Dim intPage As Integer
Dim rngTMP As Object
With objWD
.Documents.Open _
(ThisWorkbook.Path & "\" & _
"Testdatei_mit_10_Seiten.doc")
' wdGoToPage - Konstante = 1
' wdGoToAbsolute - Konstante = 1
For intPage = Tabelle1.Range _
("A" & Tabelle1.Rows.Count).End(xlUp).Row To 1 Step -1
If Not UCase(Tabelle1.Cells(intPage, 2).Value) = "X" Then
If intPage = Tabelle1.Range _
("A" & Tabelle1.Rows.Count).End(xlUp).Row Then
.Selection.GoTo 1, 1, intPage
Set rngTMP = .Selection.Bookmarks("\Page").Range
rngTMP.Start = rngTMP.Start - 1
rngTMP.Delete
Else
.Selection.GoTo 1, 1, intPage
.Selection.Bookmarks("\Page").Range.Delete
End If
End If
Next intPage
.ActiveDocument.SaveAs (ThisWorkbook.Path & _
"\" & "Test_" & Int(1000 * Rnd) + 1 & ".doc")
.ActiveDocument.Close False
.Quit
End With
End Sub

22.11.2010

Bereich als Grafik speichern!

Frage: Wie speichere ich einen Bereich als Bild / Grafik ab? Folgend mal zwei Beispiele. Realisiert über ein "ChartObject". Im ersten Beispiel wird ein fester Bereich genommen. Im zweiten Beispiel wird der Dateiname, der Pfad und der Bereich jeweils über InputBoxen abgefragt.

Bereich als Bild / Grafik speichern...[ZIP, 80 KB]

Option Explicit
Private Declare Function ShellExecute Lib "shell32.dll" _
Alias "ShellExecuteA" (ByVal hWnd As Long, _
ByVal Operation As String, ByVal Filename As String, _
Optional ByVal Parameters As String, _
Optional ByVal Directory As String, _
Optional ByVal WindowStyle As Long _
= vbMinimizedFocus) As Long
Const strPathFileNmame As String = "C:\Temp\Test123"
' Pfad- und Dateiname anpassen
Const strExt As String = "bmp"
'Const strExt As String = "jpg"
'Const strExt As String = "gif"
Public Sub Pic_Range()
Dim objDiagramm As ChartObject
Dim picGrafik As Picture
Dim rngRange As Range
On Error GoTo Fin
Set rngRange = ActiveSheet.UsedRange
Application.ScreenUpdating = False
rngRange.Copy
Worksheets.Add
Set picGrafik = ActiveSheet.Pictures.Paste
picGrafik.CopyPicture 1, -4147
Set objDiagramm = ActiveSheet.ChartObjects.Add _
(0, 0, picGrafik.Width, picGrafik.Height)
With objDiagramm
.Chart.Paste
.Chart.Export strPathFileNmame & _
"." & strExt, strExt
End With
Application.DisplayAlerts = False
ActiveSheet.Delete
Fin:
Application.ScreenUpdating = True
Application.DisplayAlerts = True
If Err.Number <> 0 Then MsgBox "Fehler: " & _
Err.Number & " " & Err.Description
Set objDiagramm = Nothing
Set picGrafik = Nothing
Set rngRange = Nothing
If Dir(strPathFileNmame & "." & strExt) <> "" Then _
ShellExecute 0, "Open", strPathFileNmame & _
"." & strExt, , , 1
End Sub
Public Sub Pic_Range_1()
Dim objDiagramm As ChartObject
Dim strVerzeichnis As String
Dim picGrafik As Picture
Dim rngRange As Range
Dim strTMP As String
On Error GoTo Fin
strTMP = InputBox("Dateiname!", "Eingabe!", "Bereich")
If Trim(strTMP) = "" Then Exit Sub
If Ordnerwahl(strVerzeichnis) <> "" Then
If Dir(strVerzeichnis & strTMP & "." & strExt) <> "" Then _
Kill (strVerzeichnis & strTMP & "." & strExt)
Set rngRange = Application.InputBox _
("Bereich mit der Maus wählen...", _
" Auswahl!", "A1:J22", , , , , 8)
Application.ScreenUpdating = False
rngRange.Copy
Worksheets.Add
Set picGrafik = ActiveSheet.Pictures.Paste
picGrafik.CopyPicture 1, -4147
Set objDiagramm = ActiveSheet.ChartObjects.Add _
(0, 0, picGrafik.Width, picGrafik.Height)
With objDiagramm
.Chart.Paste
.Chart.Export strVerzeichnis & strTMP & _
"." & strExt, strExt
End With
Application.DisplayAlerts = False
ActiveSheet.Delete
Else
MsgBox "Es wurde kein Ordner ausgewaehlt!"
End If
Fin:
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Set objDiagramm = Nothing
Set picGrafik = Nothing
Set rngRange = Nothing
If Err.Number = 424 Then MsgBox "Rangeauswahl abgebrochen!"
If Err.Number <> 0 And Not Err.Number = 424 Then
MsgBox "Fehler: " & Err.Number & _
" " & Err.Description
Else
If Dir(strVerzeichnis & strTMP & "." & strExt) <> "" Then _
ShellExecute 0, "Open", strVerzeichnis & _
strTMP & "." & strExt, , , 1
End If
End Sub
Public Function Ordnerwahl(strOrdner As String) As String
With Application.FileDialog(msoFileDialogFolderPicker)
.InitialFileName = "C:\"
'Oder Pfad in dem die Exceldatei ist
'.InitialFileName = ThisWorkbook.Path & "\"
.Title = "Ordnerauswahl"
.ButtonName = "Auswahl..."
.InitialView = msoFileDialogViewList
If .Show = -1 Then
strOrdner = .SelectedItems(1)
If Right(strOrdner, 1) <> "\" Then _
strOrdner = strOrdner & "\"
Else
strOrdner = ""
End If
End With
Ordnerwahl = strOrdner
End Function

10.11.2010

Addin Applikationsweit nutzen!

Der Code eines Addin soll Applikationsweit zur Verfügung stehen also auch noch, wenn "Datei - Neu..." ausgeführt wird. Hier mal an einem Beispiel in dem abhängig vom Zoom und der Bildschirmauflösung bei erreichen einer bestimmten Zelle diese automatisch nach oben gescrollt wird. Mit den Funktionstasten F5 / F6 kann die Funktion ein- bzw. ausgeschaltet werden. Ist jetzt exemplarisch nur für Auflösung "1280 x 1024" und "1024 x 768". Weitere Auflösungen, Zoom bzw. andere Einschränkungen können natürlich nach belieben angepasst werden. :-)

Klassenmodul, Scrollen mit Zoom und Auflösung... [ZIP, 90 KB]

Code gehört in "DieseArbeitsmappe"

Option Explicit
Private Sub Workbook_Open()
Application.OnKey "{F5}", "Application_Ereignis.An"
Application.OnKey "{F6}", "Application_Ereignis.Aus"
Call An
End Sub
Private Sub Workbook_Deactivate()
Application.OnKey "{F5}"
Application.OnKey "{F6}"
Call Aus
End Sub

Code gehört in ein allgemeines Modul mit Namen "Application_Ereignis"

Option Explicit
Option Private Module
Private Declare Function GetDeviceCaps Lib "GDI32" _
(ByVal hdc As Long, ByVal nIndex As Long) As Long
Private Declare Function GetDC Lib "User32" _
(ByVal hWnd As Long) As Long
Private Declare Function ReleaseDC Lib "User32" _
(ByVal hWnd As Long, ByVal hdc As Long) As Long
Private Declare Sub ShowWindow Lib "User32" _
(ByVal hWnd As Long, ByVal nCmdShow As Long)
Const HORZRES = 8
Const VERTRES = 10
Dim AppObject As New clsDatei
Function GetScreenRes()
Dim lRval As Long
Dim lDC As Long
Dim lHSize As Long
Dim lVSize As Long
lDC = GetDC(0&)
lHSize = GetDeviceCaps(lDC, HORZRES)
lVSize = GetDeviceCaps(lDC, VERTRES)
lRval = ReleaseDC(0, lDC)
GetScreenRes = lHSize & "x" & lVSize
End Function
Public Sub An()
Set AppObject.AppLiCa = Application
End Sub
Public Sub Aus()
Set AppObject.AppLiCa = Nothing
End Sub

Code gehört in ein Klassenmodul mit Namen "clsDatei"

Option Explicit
Public WithEvents AppLiCa As Application
Private Sub AppLiCa_SheetSelectionChange(ByVal Sh As Object, _
ByVal Target As Range)
Select Case GetScreenRes
Case "1280x1024"
Select Case ActiveWindow.Zoom
Case 200
If Target.Row Mod 18 = 0 Then
Application.Goto _
Reference:=Range(Target.Address), _
Scroll:=True
End If
Case 100
If Target.Row Mod 38 = 0 Then
Application.Goto _
Reference:=Range(Target.Address), _
Scroll:=True
End If
Case 70
If Target.Row Mod 55 = 0 Then
Application.Goto _
Reference:=Range(Target.Address), _
Scroll:=True
End If
Case 50
If Target.Row Mod 77 = 0 Then
Application.Goto _
Reference:=Range(Target.Address), _
Scroll:=True
End If
End Select
Case "1024x768"
Select Case ActiveWindow.Zoom
Case 200
If Target.Row Mod 16 = 0 Then
Application.Goto _
Reference:=Range(Target.Address), _
Scroll:=True
End If
Case 100
If Target.Row Mod 33 = 0 Then
Application.Goto _
Reference:=Range(Target.Address), _
Scroll:=True
End If
Case 75
If Target.Row Mod 43 = 0 Then
Application.Goto _
Reference:=Range(Target.Address), _
Scroll:=True
End If
Case 50
If Target.Row Mod 63 = 0 Then
Application.Goto _
Reference:=Range(Target.Address), _
Scroll:=True
End If
End Select
End Select
End Sub

Formeln auf einer UserForm in einer TextBox darstellen...

Formeln auf einer UserForm in einer TextBox anzeigen. Z. B. "Formula", "FormulaLocal"... und wie muss die Formel in VBA ...