Registriert seit: 17.02.2021
Version(en): 2019
11.05.2021, 12:10
(Dieser Beitrag wurde zuletzt bearbeitet: 11.05.2021, 12:13 von bug99.)
dann mach doch einen button der per VBA die Eingabe des "Kommentars" erfasst, im "Kommentar-Tabellenblatt" speichert und den Hyperlink einfügt evtl könnte auch auf einen bereits vorhanden Kommentar verwiesen werden, oder "Standardkommentare" angeboten werden
Folgende(r) 1 Nutzer sagt Danke an bug99 für diesen Beitrag:1 Nutzer sagt Danke an bug99 für diesen Beitrag 28
• TxbyFmjy
Registriert seit: 21.03.2021
Version(en): Professional 2010
Das hier kann man bei Bedarf anpassen/ergänzen: Modul1 Code: Option Explicit
Sub Schaltfläche1_Klicken() UserForm1.Show End Sub
Userform1 Code: Option Explicit Option Compare Text ' ************************************************************************************************ ' KONSTANTEN / PARAMETRISIERUNG ' ************************************************************************************************
'Wie viele TextBoxen sind auf der UserForm platziert? Private Const iCONST_ANZAHL_EINGABEFELDER As Integer = 6
'In welcher Zeile starten die Eingaben? Private Const lCONST_STARTZEILENNUMMER_DER_TABELLE As Long = 2
' ************************************************************************************************ ' EREIGNISROUTINEN DER USERFORM ' ************************************************************************************************
'Neuer Eintrag Schaltfläche Ereignisroutine Private Sub CommandButton1_Click() Call EINTRAG_ANLEGEN 'Aufruf der entsprechenden Verarbeitungsroutine End Sub
'Löschen Schaltfläche Ereignisroutine Private Sub CommandButton2_Click() Call EINTRAG_LOESCHEN 'Aufruf der entsprechenden Verarbeitungsroutine End Sub
'Speichern Schaltfläche Ereignisroutine Private Sub CommandButton3_Click() Call EINTRAG_SPEICHERN 'Aufruf der entsprechenden Verarbeitungsroutine End Sub
'Beenden Schaltfläche Ereignisroutine Private Sub CommandButton4_Click() Unload Me End Sub
'Klick auf die ListBox Ereignisroutine Private Sub ListBox1_Click() Call EINTRAG_LADEN_UND_ANZEIGEN 'Aufruf der entsprechenden Verarbeitungsroutine End Sub
'Diese Ereignisroutine wird beim Anzeigen der UserForm ausgeführt Private Sub UserForm_Activate() If ListBox1.ListCount > 0 Then ListBox1.ListIndex = 0 '1. Eintrag selektieren End Sub
'Startroutine, wird ausgeführt bevor die Eingabemaske angezeigt wird Private Sub UserForm_Initialize() Call LISTE_LADEN_UND_INITIALISIEREN 'Aufruf der entsprechenden Verarbeitungsroutine End Sub
' ************************************************************************************************ ' VERARBEITUNGSROUTINEN ' ************************************************************************************************
'Diese Routine wird aufgerufen um die Liste (ListBox1) zu leeren, einzustellen und neu zu füllen Private Sub LISTE_LADEN_UND_INITIALISIEREN() Dim lZeile As Long Dim lZeileMaximum As Long Dim i As Integer 'Alle TextBoxen leer machen For i = 1 To iCONST_ANZAHL_EINGABEFELDER Me.Controls("TextBox" & i) = "" Next i
ListBox1.Clear 'Liste leeren '4 Spalten einrichten 'Spalte 1: Zeilennummer des Datensatzes 'Spalte 2: Name (Spalte A) 'Spalte 3: Telefon (Spalte B) 'Spalte 4: E-Mail (Spalte C) ListBox1.ColumnCount = 4 'Spaltenbreiten der Liste anpassen (0=ausblenden, nichts=automatisch) '"<Breite Spalte 1>;<Breite Spalte 2>;<Breite Spalte 3>;<Breite Spalte 4>" ListBox1.ColumnWidths = "0;;;" 'Feste Breiten: ListBox1.ColumnWidths = "0;100;100;100" 'Um eine Schleife für alle Datensätze zu erhalten benötigen wir die letzte verwendete Zeile lZeileMaximum = Tabelle1.UsedRange.Rows.Count 'Benutzer Bereich auslesen For lZeile = lCONST_STARTZEILENNUMMER_DER_TABELLE To lZeileMaximum 'Nur wenn die Zeile benutzt / nicht leer ist, zeigen wir etwas an: If IST_ZEILE_LEER(lZeile) = False Then 'Spalte 1 der Liste mit der Zeilennummer füllen ListBox1.AddItem lZeile 'Spalten 2 bis 4 der Liste füllen ListBox1.List(ListBox1.ListCount - 1, 1) = CStr(Tabelle1.Cells(lZeile, 1).Text) ListBox1.List(ListBox1.ListCount - 1, 2) = CStr(Tabelle1.Cells(lZeile, 2).Text) ListBox1.List(ListBox1.ListCount - 1, 3) = CStr(Tabelle1.Cells(lZeile, 3).Text) End If Next lZeile End Sub
Private Sub EINTRAG_LADEN_UND_ANZEIGEN() Dim lZeile As Long Dim i As Integer 'Eingabefelder resetten For i = 1 To iCONST_ANZAHL_EINGABEFELDER Me.Controls("TextBox" & i) = "" Next i 'Nur wenn ein Eintrag selektiert/markiert ist If ListBox1.ListIndex >= 0 Then 'Die Zeilennummer des Datensatzes steht in der ersten ausgeblendeten Spalte der Liste, 'somit können wir direkt zugreifen. lZeile = ListBox1.List(ListBox1.ListIndex, 0) For i = 1 To iCONST_ANZAHL_EINGABEFELDER Me.Controls("TextBox" & i) = CStr(Tabelle1.Cells(lZeile, i).Text) Next i End If End Sub
Private Sub EINTRAG_SPEICHERN() Dim lZeile As Long Dim i As Integer 'Wenn kein Datensatz in der ListBox markiert wurde, wird die Routine beendet If ListBox1.ListIndex = -1 Then Exit Sub 'Zum Speichern benötigen wir die Zeilennummer des ausgewählten Datensatzes lZeile = ListBox1.List(ListBox1.ListIndex, 0) For i = 1 To iCONST_ANZAHL_EINGABEFELDER Tabelle1.Cells(lZeile, i) = Me.Controls("TextBox" & i) Next i 'Der Benutzer könnte die angezeigten Werte in der Liste geändert haben, 'daher aktualisieren wir den ausgewählten Eintrag entsprechend. ListBox1.List(ListBox1.ListIndex, 1) = TextBox1 ListBox1.List(ListBox1.ListIndex, 2) = TextBox2 ListBox1.List(ListBox1.ListIndex, 3) = TextBox3 End Sub
Private Sub EINTRAG_LOESCHEN() Dim lZeile As Long 'Wenn kein Datensatz in der ListBox markiert wurde, wird die Routine beendet If ListBox1.ListIndex = -1 Then Exit Sub 'Beim Löschen fragen wir zuerst den Benutzer noch einmal sicherheitshalber: If MsgBox("Sie möchten den markierten Datensatz wirklich löschen?", _ vbQuestion + vbYesNo, "Sicherheitsabfrage!") = vbYes Then 'Nur wenn er mit <JA> antwortet, löschen wir auch! 'Zum Löschen benötigen wir die Zeilennummer des ausgewählten Datensatzes lZeile = ListBox1.List(ListBox1.ListIndex, 0) 'Die ganze Zeile wird nun gelöscht Tabelle1.Rows(CStr(lZeile & ":" & lZeile)).Delete 'Und den Eintrag in der Liste müssen wir auch noch entfernen ListBox1.RemoveItem ListBox1.ListIndex End If End Sub
Private Sub EINTRAG_ANLEGEN() Dim lZeile As Long lZeile = lCONST_STARTZEILENNUMMER_DER_TABELLE 'Schleife bis eine leere ungebrauchte Zeile gefunden wird Do While IST_ZEILE_LEER(lZeile) = False lZeile = lZeile + 1 'Nächste Zeile bearbeiten Loop 'Nach Durchlauf dieser Schleife steht lZeile in der ersten leeren Zeile von Tabelle1 Tabelle1.Cells(lZeile, 1) = CStr("Neuer Eintrag Zeile " & lZeile) 'Und neuen Eintrag in die UserForm eintragen ListBox1.AddItem lZeile ListBox1.List(ListBox1.ListCount - 1, 1) = CStr("Neuer Eintrag Zeile " & lZeile) ListBox1.List(ListBox1.ListCount - 1, 2) = "" ListBox1.List(ListBox1.ListCount - 1, 3) = "" 'Den neuen Eintrag markieren mit Hilfe des ListIndex ListBox1.ListIndex = ListBox1.ListCount - 1 'Durch das Click Ereignis der ListBox werden die Daten automatisch geladen 'Und dem Benutzer direkt noch den Cursor in das erste Eingabefeld stellen und alles vorselektieren, 'so kann der Benutzer direkt loslegen mit der Dateneingabe. TextBox1.SetFocus TextBox1.SelStart = 0 TextBox1.SelLength = Len(TextBox1) End Sub
' ************************************************************************************************ ' HILFSFUNKTIONEN ' ************************************************************************************************
'Ermittelt, ob eine Zeile in Benutzung ist... Private Function IST_ZEILE_LEER(ByVal lZeile As Long) As Boolean Dim i As Long Dim sTemp As String 'Hilfsvariable initialisieren sTemp = "" 'Um zu erkennen, ob eine Zeile komplett leer/ungebraucht ist 'verketten wir einfach alle Spalteninhalte der Zeile miteinander. 'Ist die zusammengesetzte Zeichenkette aller Spalten leer, 'ist die Zeile nicht genutzt... For i = 1 To iCONST_ANZAHL_EINGABEFELDER sTemp = sTemp & Trim(CStr(Tabelle1.Cells(lZeile, i).Text)) Next i 'Rückgabewert festlegen If Trim(sTemp) = "" Then 'Die Zeile ist leer IST_ZEILE_LEER = True Else 'Die Zeile ist mindestens in einer Spalte gefüllt IST_ZEILE_LEER = False End If End Function
Registriert seit: 21.03.2021
Version(en): Professional 2010
Der von mir zitierte Code hat den Nachteil, dass alle Kommentare aus allen Spalten in ein neues Tabellenblatt geschrieben werden. (11.05.2021, 11:27)TxbyFmjy schrieb: Um mir das Abschreiben aller bereits vorhandenen Kommentare zu ersparen, ließen sich alle bereits vorhanden Kommentare auf ein neues Blatt kopieren:
Code: Sub KommentareInNeuesBlattSchreiben() Dim wksMitKommentaren As Worksheet 'die Tabelle mit Kommentaren Dim wksAusdruck As Worksheet 'die Tabelle zum Ausdrucken Dim cmtDieser As Comment 'ein Kommentar Dim lngZeile As Long
Set wksMitKommentaren = ActiveSheet 'Achtung, vorher merken, weil neues Blatt kommt Set wksAusdruck = ThisWorkbook.Worksheets.Add() 'macht eine neue Tabelle
With wksAusdruck 'Titelzeile schreiben: lngZeile = 1 .Cells(lngZeile, 1).Value = "Adresse" 'vor jeden führenden Punkt wird wksAusdruck gesetzt wegen "With" .Cells(lngZeile, 2).Value = "Zellwert" .Cells(lngZeile, 3).Value = "Kommentar" .Cells(lngZeile, 4).Value = "Transparenz" .Rows(lngZeile).Font.Bold = True 'Titelzeile fett machen
For Each cmtDieser In wksMitKommentaren.Comments 'alle Kommentare durchlaufen und in neuer Tabelle auflisten lngZeile = lngZeile + 1 .Cells(lngZeile, 1).Value = cmtDieser.Parent.AddressLocal .Cells(lngZeile, 2).Value = cmtDieser.Parent.Value .Cells(lngZeile, 3).Value = cmtDieser.Text .Cells(lngZeile, 4).Value = cmtDieser.Shape.Fill.Transparency Next End With End Sub
Unter Umständen möchte man lieber alle Kommentare jeweils nur einer einzigen Spalte auf jeweils ein neues Tabellenblatt schreiben: Code: Option Explicit Sub KommentareInNeuesBlattSchreiben_1() Dim wksMitKommentaren As Worksheet 'die Tabelle mit Kommentaren Dim wksAusdruck As Worksheet 'die Tabelle zum Ausdrucken Dim cmtDieser As Comment 'ein Kommentar Dim lngZeile As Long Dim WatchRange As Range Set wksMitKommentaren = ActiveSheet 'Achtung, vorher merken, weil neues Blatt kommt Set wksAusdruck = ThisWorkbook.Worksheets.Add() 'macht eine neue Tabelle Set WatchRange = wksMitKommentaren.Range("C:C") 'nacheinander Tabellenspalte ändern
With wksAusdruck 'Titelzeile schreiben: lngZeile = 1 .Cells(lngZeile, 1).Value = "Adresse" 'vor jeden führenden Punkt wird wksAusdruck gesetzt wegen "With" .Cells(lngZeile, 2).Value = "Zellwert" .Cells(lngZeile, 3).Value = "Kommentar" .Cells(lngZeile, 4).Value = "Transparenz" .Rows(lngZeile).Font.Bold = True 'Titelzeile fett machen For Each cmtDieser In wksMitKommentaren.Comments If Not Intersect(cmtDieser.Parent, WatchRange) Is Nothing Then lngZeile = lngZeile + 1 .Cells(lngZeile, 1).Value = cmtDieser.Parent.AddressLocal .Cells(lngZeile, 2).Value = cmtDieser.Parent.Value .Cells(lngZeile, 3).Value = cmtDieser.Text .Cells(lngZeile, 4).Value = cmtDieser.Shape.Fill.Transparency End If Next End With End Sub
Registriert seit: 21.03.2021
Version(en): Professional 2010
21.05.2021, 18:32
(Dieser Beitrag wurde zuletzt bearbeitet: 21.05.2021, 19:05 von TxbyFmjy.
Bearbeitungsgrund: Layout
)
(11.05.2021, 12:10)bug99 schrieb: dann mach doch einen button der per VBA die Eingabe des "Kommentars" erfasst, im "Kommentar-Tabellenblatt" speichert und den Hyperlink einfügt evtl könnte auch auf einen bereits vorhanden Kommentar verwiesen werden, oder "Standardkommentare" angeboten werden Gut Ding braucht Weile. Um das Einfügen des Hyperlinks zu schaffen, ist es notwendig nicht nur die Adresse der Zelle, die ein Kommentar hat, in eine neue Tabelle zu schreiben, sondern auch die zugehörige Adresse in der neuen Tabelle: Code: Option Explicit Sub KommentareInNeuesBlattSchreiben_1() Dim wksMitKommentaren As Worksheet '(Tabelle1 mit Kommentaren) Dim wksAusdruck As Worksheet '(Tabelle2 zum Ausdrucken) Dim cmtDieser As Comment 'ein Kommentar Dim lngZeile As Long Dim WatchRange As Range Set wksMitKommentaren = ActiveSheet 'Achtung, vorher merken, weil neues Blatt kommt Set wksAusdruck = ThisWorkbook.Worksheets.Add() 'macht eine neue Tabelle Set WatchRange = wksMitKommentaren.Range("C:C") 'nacheinander Tabellenspalte ändern
With wksAusdruck 'Titelzeile schreiben: lngZeile = 1 'vor jeden führenden Punkt wird wksAusdruck gesetzt wegen "With" .Cells(lngZeile, 1).Value = "Adresse1" .Cells(lngZeile, 2).Value = "Adresse2" .Cells(lngZeile, 3).Value = "Zellwert" .Cells(lngZeile, 4).Value = "Kommentar" .Cells(lngZeile, 5).Value = "Transparenz" .Rows(lngZeile).Font.Bold = True 'Titelzeile fett machen For Each cmtDieser In wksMitKommentaren.Comments If Not Intersect(cmtDieser.Parent, WatchRange) Is Nothing Then lngZeile = lngZeile + 1 .Cells(lngZeile, 1).Value = "A" & lngZeile 'Adresse1: zum Kommentar zugehörige Adresse in der neuen Tabelle2 .Cells(lngZeile, 2).Value = cmtDieser.Parent.AddressLocal 'Adresse2: Adresse der Zelle in Tabelle1, die ein Kommentar hat .Cells(lngZeile, 3).Value = cmtDieser.Parent.Value .Cells(lngZeile, 4).Value = cmtDieser.Text .Cells(lngZeile, 5).Value = cmtDieser.Shape.Fill.Transparency End If Next End With End Sub
Die Hyperlinks lassen sich dann folgendermaßen realisieren: In Tabelle1 ist manuell jeweils eine leere Spalte für die Hyperlinks einzufügen. Die Adresse1 in Tabelle2 ist entsprechend anzupassen, weil beim Einfügen des Hyperlinks der Zelleninhalt überschrieben wird. Code: Sub HyperlinkaufandereTabelleeinfügen_1()
Range(CStr(Sheets("Tabelle2").Cells(2, 2))).Select 'Tabelle2: entsprechend anpassen ' Tabelle1 mit den Kommentaren ist ActiveSheet ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:="" & "Tabelle2!" & CStr(Sheets("Tabelle2").Cells(2, 1)) _ , TextToDisplay:=CStr(Sheets("Tabelle2").Cells(2, 1))
End Sub
Die Schleife für die Erstellung aller Links einer Spalte fehlt noch.
Registriert seit: 21.03.2021
Version(en): Professional 2010
Nachfolgender halbautomatischer Weg: Mit nachfolgendem Code lassen sich die Kommentare zu jeder einzelnen Spalte der Tabelle1 mit Kommentaren auf jeweils ein neues Tabellenblatt "Kommentare_Spalte_C" usw. schreiben: Tabellenname und Spalte sind vor der Ausführung des Makros entsprechend anzupassen. Code: Sub KommentareInNeuesBlattSchreiben_2() Dim wksMitKommentaren As Worksheet 'die Tabelle mit Kommentaren Dim wksAusdruck As Worksheet 'die Tabelle zum Ausdrucken Dim cmtDieser As Comment 'ein Kommentar Dim lngZeile As Long Dim WatchRange As Range Set wksMitKommentaren = ActiveSheet 'Achtung, vorher merken, weil neues Blatt kommt Set wksAusdruck = ThisWorkbook.Worksheets.Add() 'macht eine neue Tabelle ActiveSheet.Name = "Kommentare_Spalte_C" 'Tabellenname passend zur Spalte ändern
Set WatchRange = wksMitKommentaren.Range("C:C") 'nacheinander Tabellenspalte ändern
With wksAusdruck 'Titelzeile schreiben: lngZeile = 1 .Cells(lngZeile, 1).Value = "Adresse1" 'vor jeden führenden Punkt wird wksAusdruck gesetzt wegen "With" .Cells(lngZeile, 2).Value = "Adresse2" .Cells(lngZeile, 3).Value = "Zellwert" .Cells(lngZeile, 4).Value = "Kommentar" .Cells(lngZeile, 5).Value = "Transparenz" .Rows(lngZeile).Font.Bold = True 'Titelzeile fett machen
For Each cmtDieser In wksMitKommentaren.Comments If Not Intersect(cmtDieser.Parent, WatchRange) Is Nothing Then lngZeile = lngZeile + 1 .Cells(lngZeile, 1).Value = "A" & lngZeile .Cells(lngZeile, 2).Value = cmtDieser.Parent.AddressLocal .Cells(lngZeile, 3).Value = cmtDieser.Parent.Value .Cells(lngZeile, 4).Value = cmtDieser.Text .Cells(lngZeile, 5).Value = cmtDieser.Shape.Fill.Transparency End If Next End With End Sub
Mit nachfolgendem Code lassen sich die Hyperlinks in die Tabelle1 mit den Kommentaren schreiben: In Tabelle1 mit den Kommentaren ist manuell jeweils eine leere Spalte für die Hyperlinks einzufügen, weil beim Einfügen der Hyperlinks der Zelleninhalt überschrieben wird. Die Adresse2 in der Tabelle "Kommentare_Spalte_C" usw. ist vor der Ausführung des Makros entsprechend anzupassen. Code: Sub HyperlinkaufandereTabelleeinfügen_2() 'Tabellenname passend zu Spalte ändern Dim lngZeile As Long With Worksheets("Kommentare_Spalte_C") For lngZeile = 2 To .Cells(Rows.Count, 1).End(xlUp).Row Range(CStr(Sheets("Kommentare_Spalte_C").Cells(lngZeile, 2))).Select ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:="" & "Kommentare_Spalte_C!" & CStr(Sheets("Kommentare_Spalte_C").Cells(lngZeile, 1)) _ , TextToDisplay:=CStr(Sheets("Kommentare_Spalte_C").Cells(lngZeile, 1)) Next End With End Sub
Registriert seit: 21.03.2021
Version(en): Professional 2010
Es darf kein Blattschutz und/oder Arbeitsmappenschutz aktiv sein. Hat der Name der Quelltabelle ein Leerzeichen ist es für den Ablauf des Makros kein Problem, aber der neue Name der Kommentartabelle darf keine Leerzeichen beinhalten und nicht zu lange sein. Das Makro fragt den Namen der Quelltabelle ab, den neuen Namen der neuen Kommentartabelle, kopiert die Kommentare der Quelltabelle in die Kommentartabelle und fügt in der Quelltabelle Spalten ein, in die die Hyperlinks auf die Kommentartabelle eingefügt werden: Code: Option Explicit Private wsSource As Worksheet Private wsNew As Worksheet Private wsSourcename As Variant Private wsNewname As Variant Sub Zelle_Kommentar_neueSpalte_Hyperlink() Dim varEingabewsSource As Variant Dim varEingabewsNew As Variant varEingabewsSource = InputBox("Name der Quelltabelle?") varEingabewsNew = InputBox("Name der Kommentartabelle?") wsSourcename = varEingabewsSource wsNewname = varEingabewsNew Call Spalteneinfügen_Call Call PrintCommentsByColumn_alleSpalten_Call Call HyperlinkAdresse_Call Call HyperlinkaufandereTabelleeinfügen_Call End Sub Private Sub Spalteneinfügen_Call() Dim cell As Range Dim myrange As Range, myrangeC As Range Dim col1 As Long Dim i As Long Dim j As Long Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Worksheets(wsSourcename).Activate If ActiveSheet.Comments.Count = 0 Then MsgBox "Keine Kommentare in der Tabelle" Exit Sub End If For col1 = ActiveSheet.UsedRange.Columns.Count To 1 Step -1 i = 0 Set myrangeC = Intersect(ActiveSheet.UsedRange, Columns(col1), _ Cells.SpecialCells(xlCellTypeComments)) If myrangeC Is Nothing Then GoTo nxtCol ' Keine Kommentare in einer Spalte --> nächste Spalte For Each cell In myrangeC On Error GoTo LabelC If Trim(cell.Comment.Text) <> "" Then ' Zelle mit Kommentar i = i + 1 ' Sobald in einer Spalte die erste Zelle mit Kommentar (i = 1) ermittelt wurde, ' selektiere die Zelle in der Spalte rechts davon und füge eine Spalte ein. If i = 1 Then Range(cell.Address(0, 0)).Select ActiveCell.Offset(0, i).Select ActiveCell.EntireColumn.Insert Else: GoTo nxtCol ' Es wird nach jeder Spalte mit Kommentar nur eine leere Spalte eingefügt. End If End If LabelB: On Error GoTo 0 ' error handling aktivieren Next cell nxtCol: On Error GoTo 0 ' error handling aktivieren Next col1
LabelC: If col1 = 0 Then GoTo LabelD j = j + 1 If j = 1 And Err > 0 Then Debug.Print "Anzahl Zellen", "Addressbereich Verbundene Zellen", "Error Nummer", "Error Beschreibung" If Err > 0 Then Debug.Print " "; j, " "; cell.MergeArea.Address, " "; Err.Number, ""; Err.Description Resume LabelB
LabelD: Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True On Error GoTo 0 ' error handling aktivieren End Sub Private Sub PrintCommentsByColumn_alleSpalten_Call() Dim cell As Range Dim myrange As Range, myrangeC As Range Dim col As Long Dim RowOS As Long Dim j As Long If ActiveSheet.Comments.Count = 0 Then MsgBox "No comments in entire sheet" Exit Sub End If Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Set wsSource = Worksheets(wsSourcename) Set wsSource = ActiveSheet Sheets.Add Set wsNew = ActiveSheet ActiveSheet.Name = wsNewname wsSource.Activate With wsNew.Columns("A:E") .VerticalAlignment = xlTop .WrapText = True End With wsNew.Columns("A").ColumnWidth = 10 wsNew.Columns("B").ColumnWidth = 10 wsNew.Columns("C").ColumnWidth = 15 wsNew.Columns("D").ColumnWidth = 60 wsNew.PageSetup.PrintGridlines = True RowOS = 2 wsNew.Cells(1, 1) = "Adresse1" wsNew.Cells(1, 1).Font.Bold = True wsNew.Cells(1, 2) = "Adresse2" wsNew.Cells(1, 2).Font.Bold = True wsNew.Cells(1, 3) = "Zellwert" wsNew.Cells(1, 3).Font.Bold = True wsNew.Cells(1, 4) = "Kommentar" wsNew.Cells(1, 4).Font.Bold = True For col = 1 To ActiveSheet.UsedRange.Columns.Count Set myrangeC = Intersect(ActiveSheet.UsedRange, Columns(col), _ Cells.SpecialCells(xlCellTypeComments)) If myrangeC Is Nothing Then GoTo nxtCol For Each cell In myrangeC On Error GoTo LabelC If Trim(cell.Comment.Text) <> "" Then RowOS = RowOS + 1 wsNew.Cells(RowOS, 1) = "A" & RowOS wsNew.Cells(RowOS, 2) = cell.Address(0, 0) wsNew.Cells(RowOS, 3) = cell.Text wsNew.Cells(RowOS, 4) = cell.Comment.Text End If
LabelB: On Error GoTo 0 ' error handling aktivieren Next cell nxtCol: On Error GoTo 0 ' error handling aktivieren Next col LabelC: If col > ActiveSheet.UsedRange.Columns.Count Then GoTo LabelD j = j + 1 If j = 1 And cell.MergeCells = True Then Debug.Print "Anzahl Zellen", "Addressbereich Verbundene Zellen", "Error Nummer", "Error Beschreibung" If Err > 0 Then Debug.Print " "; j, " "; cell.MergeArea.Address, " "; Err.Number, ""; Err.Description Resume LabelB LabelD: wsNew.Activate Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True On Error GoTo 0 ' error handling aktivieren End Sub Private Sub HyperlinkAdresse_Call() Dim rngZelle As Range Dim lngZeile As Long Dim varEingabe As Variant Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Set wsNew = Worksheets(wsNewname) Set wsNew = ActiveSheet With ActiveSheet lngZeile = .Range("B" & Rows.Count).End(xlUp).Row For Each rngZelle In .Range("B3:B" & lngZeile) rngZelle.Value = NTC(rngZelle.Value) Next End With Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub Public Function NTC(Optional ByVal Header As Variant, Optional ByVal Zahl As Integer) As String Dim i As Integer
If Header = "" Then GoTo Weiter Zahl = Range(Range(Header & "1").Address).Column + 1
Weiter: '*** Z = 26, ZZ = 702, XFD = 16384 *** If Zahl <= 0 Or Zahl > 16384 Then Exit Function NTC = Split(Cells(1, Zahl).Address(, 0), "$")(0) & Range(Range(Header).Address).Row End Function Private Sub HyperlinkaufandereTabelleeinfügen_Call() Dim lngZeile As Long Worksheets(wsSourcename).Activate Application.ScreenUpdating = False Application.Calculation = xlCalculationManual With ActiveWorkbook.Worksheets(wsNewname) For lngZeile = 3 To .Cells(Rows.Count, 1).End(xlUp).Row Range(CStr(Sheets(wsNewname).Cells(lngZeile, 2))).Select ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:="" & (wsNewname & "!") & CStr(Sheets(wsNewname).Cells(lngZeile, 1)) _ , TextToDisplay:=CStr(Sheets(wsNewname).Cells(lngZeile, 1)) Next End With Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub
Registriert seit: 21.03.2021
Version(en): Professional 2010
Exl121150 schrieb:Kommentare in neue Kommentartabelle kopieren, Quelltabelle: Hyperlinks auf die Kommentartabelle
Hallo,
du verwendest den Namen eines Arbeitsblattes (=Kommentartabelle) in einem Hyperlink ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", _ SubAddress:=wsNewname & "!" & CStr(Sheets(wsNewname).Cells(lngZeile, 1)), _ TextToDisplay:=CStr(Sheets(wsNewname).Cells(lngZeile, 1))
Ist in der Variablen "wsNewname" ein Leerzeichen enthalten, so gibt es ein Problem. Einen solchen Namen musst du zwingend mit Hochkommas begrenzen: ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", _ SubAddress:="'" & wsNewname & "'!" & CStr(Sheets(wsNewname).Cells(lngZeile, 1)), _ TextToDisplay:=CStr(Sheets(wsNewname).Cells(lngZeile, 1)) Es darf kein Blattschutz und/oder Arbeitsmappenschutz aktiv sein. Das Makro fragt den Namen der Quelltabelle ab, den neuen Namen der neuen Kommentartabelle, kopiert die Kommentare der Quelltabelle in die Kommentartabelle und fügt in der Quelltabelle Spalten ein, in die die Hyperlinks auf die Kommentartabelle eingefügt werden: Code: Option Explicit
Private wsSource As Worksheet Private wsNew As Worksheet Private wsSourcename As Variant Private wsNewname As Variant
Sub Zelle_Kommentar_neueSpalte_Hyperlink() Dim varEingabewsSource As Variant Dim varEingabewsNew As Variant varEingabewsSource = InputBox("Name der Quelltabelle?") varEingabewsNew = InputBox("Name der Kommentartabelle?") wsSourcename = varEingabewsSource wsNewname = varEingabewsNew Call Spalteneinfügen_Call Call PrintCommentsByColumn_alleSpalten_Call Call HyperlinkAdresse_Call Call HyperlinkaufandereTabelleeinfügen_Call End Sub
Code: Private Sub Spalteneinfügen_Call() Dim cell As Range Dim myrange As Range, myrangeC As Range Dim col1 As Long Dim i As Long Dim j As Long Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Worksheets(wsSourcename).Activate If ActiveSheet.Comments.Count = 0 Then MsgBox "Keine Kommentare in der Tabelle" Exit Sub End If For col1 = ActiveSheet.UsedRange.Columns.Count To 1 Step -1 i = 0 Set myrangeC = Intersect(ActiveSheet.UsedRange, Columns(col1), _ Cells.SpecialCells(xlCellTypeComments)) If myrangeC Is Nothing Then GoTo nxtCol ' Keine Kommentare in einer Spalte --> nächste Spalte For Each cell In myrangeC On Error GoTo LabelC If Trim(cell.Comment.Text) <> "" Then ' Zelle mit Kommentar i = i + 1 ' Sobald in einer Spalte die erste Zelle mit Kommentar (i = 1) ermittelt wurde, ' selektiere die Zelle in der Spalte rechts davon und füge eine Spalte ein. If i = 1 Then Range(cell.Address(0, 0)).Select ActiveCell.Offset(0, i).Select ActiveCell.EntireColumn.Insert Else: GoTo nxtCol ' Es wird nach jeder Spalte mit Kommentar nur eine leere Spalte eingefügt. End If End If
LabelB: On Error GoTo 0 ' error handling aktivieren Next cell
nxtCol: On Error GoTo 0 ' error handling aktivieren Next col1
LabelC: If col1 = 0 Then GoTo LabelD j = j + 1 If j = 1 And Err > 0 Then Debug.Print "Anzahl Zellen", "Addressbereich Verbundene Zellen", "Error Nummer", "Error Beschreibung" If Err > 0 Then Debug.Print " "; j, " "; cell.MergeArea.Address, " "; Err.Number, ""; Err.Description Resume LabelB
LabelD: Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True On Error GoTo 0 ' error handling aktivieren End Sub
Code: Private Sub PrintCommentsByColumn_alleSpalten_Call() Dim cell As Range Dim myrange As Range, myrangeC As Range Dim col As Long Dim RowOS As Long Dim j As Long If ActiveSheet.Comments.Count = 0 Then MsgBox "No comments in entire sheet" Exit Sub End If Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Set wsSource = Worksheets(wsSourcename) Set wsSource = ActiveSheet Sheets.Add Set wsNew = ActiveSheet ActiveSheet.Name = wsNewname wsSource.Activate With wsNew.Columns("A:E") .VerticalAlignment = xlTop .WrapText = True End With wsNew.Columns("A").ColumnWidth = 10 wsNew.Columns("B").ColumnWidth = 10 wsNew.Columns("C").ColumnWidth = 15 wsNew.Columns("D").ColumnWidth = 60 wsNew.PageSetup.PrintGridlines = True RowOS = 2 wsNew.Cells(1, 1) = "Adresse1" wsNew.Cells(1, 1).Font.Bold = True wsNew.Cells(1, 2) = "Adresse2" wsNew.Cells(1, 2).Font.Bold = True wsNew.Cells(1, 3) = "Zellwert" wsNew.Cells(1, 3).Font.Bold = True wsNew.Cells(1, 4) = "Kommentar" wsNew.Cells(1, 4).Font.Bold = True For col = 1 To ActiveSheet.UsedRange.Columns.Count Set myrangeC = Intersect(ActiveSheet.UsedRange, Columns(col), _ Cells.SpecialCells(xlCellTypeComments)) If myrangeC Is Nothing Then GoTo nxtCol For Each cell In myrangeC On Error GoTo LabelC If Trim(cell.Comment.Text) <> "" Then RowOS = RowOS + 1 wsNew.Cells(RowOS, 1) = "A" & RowOS wsNew.Cells(RowOS, 2) = cell.Address(0, 0) wsNew.Cells(RowOS, 3) = cell.Text wsNew.Cells(RowOS, 4) = cell.Comment.Text End If
LabelB: On Error GoTo 0 ' error handling aktivieren Next cell
nxtCol: On Error GoTo 0 ' error handling aktivieren Next col
LabelC: If col > ActiveSheet.UsedRange.Columns.Count Then GoTo LabelD j = j + 1 If j = 1 And cell.MergeCells = True Then Debug.Print "Anzahl Zellen", "Addressbereich Verbundene Zellen", "Error Nummer", "Error Beschreibung" If Err > 0 Then Debug.Print " "; j, " "; cell.MergeArea.Address, " "; Err.Number, ""; Err.Description Resume LabelB
LabelD: wsNew.Activate Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True On Error GoTo 0 ' error handling aktivieren End Sub
Code: Private Sub HyperlinkAdresse_Call() Dim rngZelle As Range Dim lngZeile As Long Dim varEingabe As Variant Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Set wsNew = Worksheets(wsNewname) Set wsNew = ActiveSheet With ActiveSheet lngZeile = .Range("B" & Rows.Count).End(xlUp).Row For Each rngZelle In .Range("B3:B" & lngZeile) rngZelle.Value = NTC(rngZelle.Value) Next End With Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub
Code: Public Function NTC(Optional ByVal Header As Variant, Optional ByVal Zahl As Integer) As String Dim i As Integer
If Header = "" Then GoTo Weiter Zahl = Range(Range(Header & "1").Address).Column + 1
Weiter: '*** Z = 26, ZZ = 702, XFD = 16384 *** If Zahl <= 0 Or Zahl > 16384 Then Exit Function NTC = Split(Cells(1, Zahl).Address(, 0), "$")(0) & Range(Range(Header).Address).Row End Function
korrigiert: Hochkomma (Apostroph) hinzugefügt Code: "'" & wsNewname & "'!"
Code: Private Sub HyperlinkaufandereTabelleeinfügen_Call() Dim lngZeile As Long Worksheets(wsSourcename).Activate Application.ScreenUpdating = False Application.Calculation = xlCalculationManual With ActiveWorkbook.Worksheets(wsNewname) For lngZeile = 3 To .Cells(Rows.Count, 1).End(xlUp).Row Range(CStr(Sheets(wsNewname).Cells(lngZeile, 2))).Select ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:="'" & wsNewname & "'!" & CStr(Sheets(wsNewname).Cells(lngZeile, 1)) _ , TextToDisplay:=CStr(Sheets(wsNewname).Cells(lngZeile, 1)) Next End With Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub
cell comment hyperlink (korr).xlsm (Größe: 144,26 KB / Downloads: 1)
Registriert seit: 21.03.2021
Version(en): Professional 2010
(29.08.2021, 11:01)schauan schrieb: ... und nun, wie weiter? Da muss ich noch einmal genauer hinschauen: ActiveSheet.UsedRange.Columns.Count - 8 what does it mean?Zitat:ActiveSheet.UsedRange.select
Seems like you want to move around. Try this:
ActiveSheet.UsedRange.select
results in....
If you want to move that selection 3 rows up then try this
ActiveSheet.UsedRange.offset(-3).select
does this...
Zitat:To find the last column which has data, use .Find
BernardSaucier has already given you an answer. My post is not an answer but an explanation as to why you shouldn't be using `UsedRange`.
`UsedRange` is highly unreliable as shown HERE
To find the last column which has data, use `.Find` and then subtract from it.
Code: With Sheets("Sheet1") If Application.WorksheetFunction.CountA(.Cells) <> 0 Then lastCol = .Cells.Find(What:="*", _ After:=.Range("A1"), _ Lookat:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByColumns, _ SearchDirection:=xlPrevious, _ MatchCase:=False).Column Else lastCol = 1 End If End With If lastCol > 8 Then 'Debug.Print ActiveSheet.UsedRange.Columns.Count - 8 'The above becomes Debug.Print lastCol - 8 End If
Gewollt ist, dass alle Kommentare einer beliebigen Quelltabelle in eine neue Kommentartabelle kopiert und in dieser Quelltabelle für alle kopierten Kommentare Hyperlinks auf diese neue Kommentartabelle eingefügt werden. Angepasst an das Gewollte meines Schnipsels, sollte die Entwicklung folgendermaßen weiter vorangetrieben werden: In Private Sub Spalteneinfügen_Call() Code: Dim lastCol1 As Integer
Code: With Sheets(wsSourcename) If Application.WorksheetFunction.CountA(.Cells) <> 0 Then lastCol1 = .Cells.Find(What:="*", _ After:=.Range("A1"), _ Lookat:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByColumns, _ SearchDirection:=xlPrevious, _ MatchCase:=False).Column Else lastCol1 = 1 End If End With
Code: For col1 = lastCol1 To 1 Step -1
i = 0
Set myrangeC = Intersect(Columns(col1), _ Cells.SpecialCells(xlCellTypeComments))
sowie in Private Sub PrintCommentsByColumn_alleSpalten_Call() Code: Dim lastCol As Integer
Code: With Sheets(wsSourcename) If Application.WorksheetFunction.CountA(.Cells) <> 0 Then lastCol = .Cells.Find(What:="*", _ After:=.Range("A1"), _ Lookat:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByColumns, _ SearchDirection:=xlPrevious, _ MatchCase:=False).Column Else lastCol = 1 End If End With
Code: For col = 1 To lastCol
Set myrangeC = Intersect(Columns(col), _ Cells.SpecialCells(xlCellTypeComments))
Sobald meine Tests abgeschlossen sind, melde ich mich wieder.
Registriert seit: 21.03.2021
Version(en): Professional 2010
03.10.2021, 15:38
(Dieser Beitrag wurde zuletzt bearbeitet: 03.10.2021, 15:41 von TxbyFmjy.
Bearbeitungsgrund: Überschrift ergänzt
)
Kommentare in neue Kommentartabelle kopieren, in der Quelltabelle einfügen von Hyperlinks auf die Kommentare in der Kommentartabelle
Hallo, ich habe recherchiert, dass die Private Function NTC ihren Ursprung in einer anderen Aufgabenstellung hat. Sowohl die Variable "Header" als auch die Variable "Zahl" haben in der anderen Aufgabenstellung eine Bedeutung, weil im Originalcode für die Variable "Header" (Spaltenüberschrift) oder die Variable "Zahl" in beiden Fällen jeweils die Spaltenbezeichnung zurückgegeben wird. Originalcode (Suche im WWW nach "bei target.offset statt Spaltenindex die Spaltenüberschrift") Zitat:Code: Function NTC(Optional ByVal Header As String, Optional ByVal Zahl As Integer) As String Dim I As Integer Dim acol As Long Dim Bereich As Range, RNG As Range
If Header = "" Then GoTo Weiter acol = Cells(1, Columns.Count).End(xlToLeft).Column Set Bereich = Range(Range("A1"), Cells(1, acol)) Set RNG = Bereich.Find(What:=Header, LookIn:=xlValues, LookAt:=xlWhole) If Not RNG Is Nothing Then Zahl = Range(RNG.Address).Column End If
Weiter: '*** Z = 26, ZZ = 702, XFD = 16384 *** If Zahl <= 0 Or Zahl > 16384 Then Exit Function NTC = Split(Cells(1, Zahl).Address(, 0), "$")(0) End Function
Code: Sub Hohls() MsgBox NTC(Header:="DeinHeader") MsgBox NTC(Zahl:=16384) End Sub
Es wird dann beide male die Spaltenbezeichnung zurückgegeben. Aus diesem Grund habe ich die Private Function NTC für diese Aufgabenstellung korrigiert: Code: Public Function NTC(Zellenwert As String) As String Dim i As Integer Dim Zahl As Integer
If Zellenwert = "" Then GoTo Weiter Zahl = Range(Range(Zellenwert & "1").Address).Column + 1
Weiter: '*** Z = 26, ZZ = 702, XFD = 16384 *** If Zahl <= 0 Or Zahl > 16384 Then Exit Function NTC = Split(Cells(1, Zahl).Address(, 0), "$")(0) & Range(Range(Zellenwert).Address).Row End Function
Das dort erklärte, habe ich auch noch korrigiert. Tutti completti: Es sind selbstverständlich noch Code-Optimierungen möglich und nöitg, aber das Grundgerüst steht und funktioiniert jetzt. Alle Kommentare einer beliebigen Quelltabelle werden in eine neue Kommentartabelle kopiert und in der Quelltabelle für alle Kommentare Hyperlinks auf die Kommentartabelle eingefügt. Code: Option Explicit
Private wsSource As Worksheet Private wsNew As Worksheet Private wsSourcename As Variant Private wsNewname As Variant
Sub Zelle_Kommentar_neueSpalte_Hyperlink() Dim varEingabewsSource As Variant Dim varEingabewsNew As Variant varEingabewsSource = InputBox("Name der Quelltabelle?") varEingabewsNew = InputBox("Name der Kommentartabelle?") wsSourcename = varEingabewsSource wsNewname = varEingabewsNew Call Spalteneinfügen_Call Call PrintCommentsByColumn_alleSpalten_Call Call HyperlinkAdresse_Call Call HyperlinkaufandereTabelleeinfügen_Call End Sub
Code: Private Sub Spalteneinfügen_Call() Dim cell As Range Dim myrange As Range, myrangeC As Range Dim col1 As Long Dim i As Long Dim j As Long Dim lastCol1 As Integer
Worksheets(wsSourcename).Activate
If ActiveSheet.Comments.Count = 0 Then MsgBox "Keine Kommentare in der Tabelle" Exit Sub End If
Application.ScreenUpdating = False Application.Calculation = xlCalculationManual
With Sheets(wsSourcename) If Application.WorksheetFunction.CountA(.Cells) <> 0 Then lastCol1 = .Cells.Find(What:="*", _ After:=.Range("A1"), _ Lookat:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByColumns, _ SearchDirection:=xlPrevious, _ MatchCase:=False).Column Else lastCol1 = 1 End If End With
For col1 = lastCol1 To 1 Step -1
i = 0
Set myrangeC = Intersect(Columns(col1), _ Cells.SpecialCells(xlCellTypeComments))
If myrangeC Is Nothing Then GoTo nxtCol ' Keine Kommentare in einer Spalte --> nächste Spalte For Each cell In myrangeC On Error GoTo LabelC If Trim(cell.Comment.Text) <> "" Then ' Zelle mit Kommentar i = i + 1 ' Sobald in einer Spalte die erste Zelle mit Kommentar (i = 1) ermittelt wurde, ' selektiere die Zelle in der Spalte rechts davon und füge eine Spalte ein. If i = 1 Then Range(cell.Address(0, 0)).Select ActiveCell.Offset(0, i).Select ActiveCell.EntireColumn.Insert Else: GoTo nxtCol ' Es wird nach jeder Spalte mit Kommentar nur eine leere Spalte eingefügt. End If End If
LabelB: On Error GoTo 0 ' error handling aktivieren Next cell
nxtCol: On Error GoTo 0 ' error handling aktivieren Next col1
LabelC: If col1 = 0 Then GoTo LabelD j = j + 1 If j = 1 And Err > 0 Then Debug.Print "Anzahl Zellen", "Addressbereich Verbundene Zellen", "Error Nummer", "Error Beschreibung" If Err > 0 Then Debug.Print " "; j, " "; cell.MergeArea.Address, " "; Err.Number, ""; Err.Description Resume LabelB
LabelD: Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True On Error GoTo 0 ' error handling aktivieren End Sub
Code: Private Sub PrintCommentsByColumn_alleSpalten_Call() Dim cell As Range Dim myrange As Range, myrangeC As Range Dim col As Long Dim RowOS As Long Dim j As Long Dim lastCol As Integer
If ActiveSheet.Comments.Count = 0 Then MsgBox "No comments in entire sheet" Exit Sub End If
Application.ScreenUpdating = False Application.Calculation = xlCalculationManual
With Sheets(wsSourcename) If Application.WorksheetFunction.CountA(.Cells) <> 0 Then lastCol = .Cells.Find(What:="*", _ After:=.Range("A1"), _ Lookat:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByColumns, _ SearchDirection:=xlPrevious, _ MatchCase:=False).Column Else lastCol = 1 End If End With
Set wsSource = Worksheets(wsSourcename) Set wsSource = ActiveSheet Sheets.Add Set wsNew = ActiveSheet ActiveSheet.Name = wsNewname wsSource.Activate With wsNew.Columns("A:E") .VerticalAlignment = xlTop .WrapText = True End With wsNew.Columns("A").ColumnWidth = 10 wsNew.Columns("B").ColumnWidth = 10 wsNew.Columns("C").ColumnWidth = 15 wsNew.Columns("D").ColumnWidth = 60 wsNew.PageSetup.PrintGridlines = True RowOS = 2 wsNew.Cells(1, 1) = "Adresse1" wsNew.Cells(1, 1).Font.Bold = True wsNew.Cells(1, 2) = "Adresse2" wsNew.Cells(1, 2).Font.Bold = True wsNew.Cells(1, 3) = "Zellwert" wsNew.Cells(1, 3).Font.Bold = True wsNew.Cells(1, 4) = "Kommentar" wsNew.Cells(1, 4).Font.Bold = True
For col = 1 To lastCol
Set myrangeC = Intersect(Columns(col), _ Cells.SpecialCells(xlCellTypeComments))
If myrangeC Is Nothing Then GoTo nxtCol For Each cell In myrangeC On Error GoTo LabelC If Trim(cell.Comment.Text) <> "" Then RowOS = RowOS + 1 wsNew.Cells(RowOS, 1) = "A" & RowOS wsNew.Cells(RowOS, 2) = cell.Address(0, 0) wsNew.Cells(RowOS, 3) = cell.Text wsNew.Cells(RowOS, 4) = cell.Comment.Text End If
LabelB: On Error GoTo 0 ' error handling aktivieren Next cell
nxtCol: On Error GoTo 0 ' error handling aktivieren Next col
LabelC: If col > ActiveSheet.UsedRange.Columns.Count Then GoTo LabelD j = j + 1 If j = 1 And cell.MergeCells = True Then Debug.Print "Anzahl Zellen", "Addressbereich Verbundene Zellen", "Error Nummer", "Error Beschreibung" If Err > 0 Then Debug.Print " "; j, " "; cell.MergeArea.Address, " "; Err.Number, ""; Err.Description Resume LabelB
LabelD: wsNew.Activate Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True On Error GoTo 0 ' error handling aktivieren End Sub
Code: Private Sub HyperlinkAdresse_Call() Dim rngZelle As Range Dim lngZeile As Long Dim varEingabe As Variant Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Set wsNew = Worksheets(wsNewname) Set wsNew = ActiveSheet With ActiveSheet lngZeile = .Range("B" & Rows.Count).End(xlUp).Row For Each rngZelle In .Range("B3:B" & lngZeile) rngZelle.Value = NTC(rngZelle.Value) Next End With Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub
Code: Public Function NTC(Zellenwert As String) As String Dim i As Integer Dim Zahl As Integer
If Zellenwert = "" Then GoTo Weiter Zahl = Range(Range(Zellenwert & "1").Address).Column + 1
Weiter: '*** Z = 26, ZZ = 702, XFD = 16384 *** If Zahl <= 0 Or Zahl > 16384 Then Exit Function NTC = Split(Cells(1, Zahl).Address(, 0), "$")(0) & Range(Range(Zellenwert).Address).Row End Function
Code: Private Sub HyperlinkaufandereTabelleeinfügen_Call() Dim lngZeile As Long Worksheets(wsSourcename).Activate Application.ScreenUpdating = False Application.Calculation = xlCalculationManual With ActiveWorkbook.Worksheets(wsNewname) For lngZeile = 3 To .Cells(Rows.Count, 1).End(xlUp).Row Range(CStr(Sheets(wsNewname).Cells(lngZeile, 2))).Select ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:="'" & wsNewname & "'!" & CStr(Sheets(wsNewname).Cells(lngZeile, 1)) _ , TextToDisplay:=CStr(Sheets(wsNewname).Cells(lngZeile, 1)) Next End With Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub
cell comment hyperlink (korr 2).xlsm (Größe: 145,04 KB / Downloads: 2)
Registriert seit: 21.03.2021
Version(en): Professional 2010
In Private Sub HyperlinkAdresse_Call() ist Dim varEingabe As Variant überflüssig und wurde gelöscht.
cell comment hyperlink (korr 3).xlsm (Größe: 145,03 KB / Downloads: 2)
|