Snipplets

Geknackte Nüsse, vielleicht kann es ja jemand brauchen. Zur freien Verfügung!

 

1. Kommentar mit Änderungsdatum einer Zelle

Problem: In einer Excel Tabelle werden laufend Werte eingetragen. Diese veralten mit der Zeit und man wüsste gern, wann der Wert eingetragen worden ist und von wem.

Lösung: Ein Makro schreibt diese Informationen in einen Kommentar der geänderten Zelle.

Das Makro muss in den Codebereich der Tabelle, wo es wirken soll:

Private Sub Worksheet_Change(ByVal r As Range)
rr = r.Column
s = r.Row
Cells(s, rr).AddComment
Cells(s, rr).Comment.Text Text:=Application.UserName & Chr(10) & "Stand: " & Date & " | " & Time
Cells(s, rr).Comment.Shape.TextFrame.AutoSize = True
End Sub

 

2. Suchen und Ersetzen in einer Microsoft SQL Datenbank

Problem: Alle E-Mail Adressen in einer Datenbank bekommen eine neue Domain. Der Client sieht suchen und Ersetzen nicht vor. Alles manuell über den Datenbank Manager dauert lange und man bricht sich die Finger. Aua.

Lösung: Man nutzt eine geekische SQL-Abfrage.

Eine neue Abfrage im Server Management Studio erstellen und dort folgendes eingeben:

Update [Datenbankname].[dbo].[Tabelle]
Set eMailSpalte =Replace(eMailSpalte,'altedomain.de','neuedomain.de')

 

3. Kommentar mit Änderungsverlauf einer Zelle

Problem: In einer Excel Tabelle werden laufend Werte eingetragen. Manchmal möchte man ohne viel Aufwand wissen, wie sich ein Wert entwickelt hat, welche vorherigen Werte eingetragen waren und von wem...

Lösung: Ein Makro schreibt diese Informationen in einen Kommentar der geänderten Zelle.

Das Makro muss in den Codebereich der Tabelle, wo es wirken soll:

Private Sub Worksheet_Change(ByVal r As Range)
On Error Resume Next

Dim history As String
Dim oldval As String
Dim länge As Integer
Dim wert As String

rr = r.Column
s = r.Row

' Nur Zeilen 6 bis 22 überwachen
If s < 6 Or s > 22 Then Exit Sub

wert = Cells(s, rr).Formula

If wert = "" Then wert = "leer"

history = Cells(s, rr).Comment.Text
If Err.Number <> 0 Then
    history = "Vorheriger Wert: unbekannt"
    Err.Clear
    End If

länge = Len(history)

oldval = Mid(history, InStr(1, history, ": ") + 2, InStr(1, history, Chr(10)) - InStr(1, history, ": ") - 2)
Debug.Print "oldval = " & oldval

If oldval = wert Then Exit Sub

With Cells(s, rr)
.ClearComments
.AddComment
.Comment.Text Text:=Format(Date, "dd.mm.yy") & ", " & Format(Time, "hh:mm") & " - " & Application.UserName & " ändert den Inhalt auf: " & wert & Chr(10) & history
.Comment.Shape.TextFrame.AutoSize = True
End With

End Sub

 

4. Bilder sollen irgendwie sinnvoll in einer Tabelle auftauchen

Problem: In einer Excel Tabelle werden Bilder in einer Spalte benötigt. Leider fliegen die bei Excel immer so doof über alle Zellen, wenn man sie nicht mühsam in Größe und Position an einer Zelle fest macht.

Lösung: Ein Makro schiebt jedes Bild kurz neben die Ecke oben/links der Zelle, vor dem es gerade "fliegt". Dann wird es auf 148 resized und die Zeile der Zelle wird auf 150 resized. Dazu wird das Bild mit der Zelle in Position verbunden. Jetzt sieht es toll aus, lässt sich sortieren und scrollen.

Das Makro muss in den Codebereich der Tabelle,wo es wirken soll, Aufruf am besten mit einem Button in der fixierten Überschrift der Spalte:

Public Sub Bilder()
   Dim n As Long
   On Error Resume Next
   With ThisWorkbook.Worksheets(1)
      For n = 1 To .Shapes.Count
      If CBool(.Shapes(n).Type = 11 Or .Shapes(n).Type = 13) Then
         .Shapes(n).Placement = xlMove
         .Shapes(n).Height = 148
         .Shapes(n).Top = .Shapes(n).TopLeftCell.Top + 1
         .Shapes(n).TopLeftCell.RowHeight = 150
         .Shapes(n).Left = .Shapes(n).TopLeftCell.Left + 1
         End If
       Next n
   End With
End Sub

 

5. Outlook: Alle E-Mails, die man verschickt, sollen im Posteingang abgelegt werden

Problem: Wer es aus anderen Programmen kennt, vermisst es in Outlook. Wenn man z.B. alle E-Mails in Ordnern organisieren möchte, nervt es, wenn man den Postausgang in Unterordner verteilen muss. Nutzt man aber den Codeschnippel und die Outlook Anzeigeoption Als Unterhaltung anzeigen, dann sortiert es sich schon viel leichter. Gesendete E-Mail wollen auch verfolgt werden, dass ist ebenfalls einfacher, wenn sie im Posteingang liegen bleiben.

Lösung: Ein Makro definiert den Ablageort beim Senden von E-Mails auf den Posteingang.

Das Makro muss in den Codebereich von Outlook (Alt+F11):

Public Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
   If (Item.MessageClass = "IPM.Note") Then Set Item.SaveSentMessageFolder = Outlook.Session.GetDefaultFolder(olFolderInbox)
End Sub

 

6. weitere folgen... vielleicht