VBA Excel2010 condicional formating

Hallo zusammen,

ich habe ein VBA-Excel Programm das mehrere Codes für ein bestimmtes Worksheet hat.
Diese möchte ich aber auch auf andere Worksheets verwenden.
Einer davon wäre, das ich in einem Blatt über eine UF ein Standardmass eingeben will und daneben die Toleranz, damit mir das Programm selber Ober- und Untergrenze ermittlet und demensprechend Eingaben entweder schwarz (in der Toleranz) oder rot (ausserhalb der Toleranz) einfärbt.

Mein bisheriger Code war der Folgende:
With Worksheets(„xy“).Range(„A1:Z5“).FormatConditions _
.Add(Type:=xlValidateWholeNumber, _
Operator:=xlNotBetween, Formula1:=„148,70“, Formula2:=„149,30“)
With .Font
.Italic = True
.ColorIndex = 3
End With
End With

Hier möchte ich also die Formula1 und 2 variabel halten, weiss aber leider nicht wie!!
Ich freue mich sehr wenn mir da jemand helfen kann!!!
Danke!

Grüße

Würde es mal damit versuchen:

Dim dblF1 as Double, dblF2 as Double
With Worksheets(„xy“).Range(„A1:Z5“).FormatConditions _
.Add(Type:=xlValidateWholeNumber, _
Operator:=xlNotBetween,
Formula1:= dblF1, Formula2:= dblF2)
With .Font
.Italic = True
.ColorIndex = 3
End With
End With

Grüsse
Sebastian

PS: Sollte es nicht gehen, dann: CStr(dblF1) bzw. CStr(dblF2)

Hallo Sebastian,

leider haben beide Varianten nicht funktioniert.
Vielleicht habe ich einen Fehler gemacht oder was übersehen (bin nämlich keine VBA-Kennerin)… Aber ich glaube ich habe vielleicht mein Problem nicht so gut beschreiben können:
Ich habe eine UF mit mehreren TextBoxen in denen ich Maße eingeben kann. Ein Maß ist immer das Soll-Maß und das andere die Toleranz.
Was das Programm machen soll ist dieses Soll-Maß aus der Textbox nehmen und einmal die Toleranz abziehen und einmal addieren, damit ich die Ober- und Untergrenze habe.
Mit diesen Werten möchte ich dann in Fomula1 und 2 arbeiten.
In dem Code den ich nämlich in meine Frage kopiert habe, sind die Ober- und Untergrenze nämlich immer fix, und das möchte ich eben ändern, da ich immmer wieder neue Werte benötige…

Was kann ich da machen??

Liebe Grüße,
Sonja

Sorry, ich hab’s eher mit Word.

Hallo Sonja,

wenn du statt „Worksheets(„xy“).“ „ActiveSheet.“ verwendest, dann funktioniert es auf jedem ausgewählten Worksheet.

Gruß
Natator

Grüezi Sonja

Mein bisheriger Code war der Folgende:
With Worksheets(„xy“).Range(„A1:Z5“).FormatConditions _
.Add(Type:=xlValidateWholeNumber, _
Operator:=xlNotBetween, Formula1:=„148,70“,
Formula2:=„149,30“)
With .Font
.Italic = True
.ColorIndex = 3
End With
End With

Hier möchte ich also die Formula1 und 2 variabel halten, weiss
aber leider nicht wie!!

Das könntest Du z.B. über je eine InputBox machen, in der diese beiden Werte abgefragt und dann im Code verwendet werden.

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Hallo,

Mein bisheriger Code war der Folgende:
With Worksheets(„xy“).Range(„A1:Z5“).FormatConditions

http://ms-excel.eu/vba/vbaworksheets/vbatabellenblat…

„xy“ ersetzen, was in der oben angeführten Seite steht.

Gruß

Hallo

Ja, um etwas aus eine UF einzulesen benötigst du folgendes:
dim strtxt as string;
strtxt = ufname.meinetextbox.value
if strtxt="" then
msgbox „Eingabefehler“,critical,„Fehler“
exit sub
end if
Grüsse Sebastian

Hallo Sonja,

dafür reichen meine VBA-Kenntnisse leider noch nicht aus.

gruß Hugo

Hallo Sonja,

hier ein angepasster Code, wenn die Werte für Maß und Toleranz in Textboxen eines Userforms eingegeben werden.
Die Namen der Textboxen muss du ggf. im VBA-Editor anpassen.

Gruß
Franz

'Code im Userform-Module
Private Sub CommandButton1\_Click()
 'Zellbereich A1:Z5 im aktiven Tabellenblatt gemäß Eingaben im Userform \_
 für Wert und Toleranz bedingt formatieren
 'Werte außerhalb Toleranz werden kursiv/rot angezeigt
 Dim wks As Worksheet
 Dim varWert1, varWert2

 Set wks = ActiveSheet
' Set wks = Worksheets("TabelleXYZ")

 'Textboxen auf Zahlenwerte prüfen
 If IsNumeric(Me.TextBox\_Mass) And IsNumeric(Me.TextBox\_Toleranz) Then
 'untere Grenze
 varWert1 = CDbl(Me.TextBox\_Mass) - CDbl(Me.TextBox\_Toleranz)
 'obere Grenze
 varWert2 = CDbl(Me.TextBox\_Mass) + CDbl(Me.TextBox\_Toleranz)
 With wks.Range("A1:Z5")
 .FormatConditions.Delete
 With .FormatConditions.Add(Type:=xlCellValue, \_
 Operator:=xlNotBetween, Formula1:=varWert1, Formula2:=varWert2)
 With .Font
 .Italic = True
 .ColorIndex = 3
 End With
 End With
 End With
 Me.Hide
 Else
 MsgBox "Für Wert und Toleranz muss eine Zahl eingeben werden!", \_
 vbInformation + vbOKOnly, "Bedingte Formatierung Zellbereich A1:Z5"
 End If
End Sub

Hallo *Sonja*

das musst du über Change-Event des Worksheets machen.

Private Sub Worksheet\_Change(ByVal Target As Range)
 'hier aufruf deiner Methode
End Sub

MfG.
W.W.

hallo sonja,

wenn ich dich richtig verstehe, sollen 148,70 und 149,30 vom anwender verändert werden können, ohne das vba-programm zu ändern. dafür wäre folgender code geeignet; min und max stehen in den zellen a7 und a8:

With Worksheets(„xy“).Range(„A1:Z5“).FormatConditions _
.Add(Type:=xlValidateWholeNumber, _
Operator:=xlNotBetween, Formula1:="=$A$7", Formula2:="=$A$8")
With .Font
.Italic = True
.ColorIndex = 3
End With
End With

viel erfolg, ascan

Hallo Franz,

du hast mir wirklich sehr geholfen!!
Funktioniert einwandfrei! =)
Vielen lieben Dank!!!

Vielleicht kannst du mir noch bei zwei anderen - für dich wahrscheinlich - Kleinigkeiten helfen:
Ich habe Textboxen in die ich Zahlen eingebe. Jetzt muss ich aber immer einen Punkt für die Kommastellen eingeben statt ein Komma. Ich hab schon mit der Ländereinstellung herumgepfuscht, aber es will immer noch nicht so wie ich gerne hätte.
Hättest du da auch noch einen Tipp?
Und dann habe ich noch eine Schleife, die ich gerne per Klick auf einen Button im Excel beenden möchte.
Geht das überhaupt?

Der Code dieser Schleife ist der Folgende:
Dim Spa As Long
Application.ScreenUpdating = False
With Worksheets(„prueba_reunión“)
Spa = Application.Max(.Rows(20))
If CDate(Spa)

Hallo Sonja,

eigentlich fehlen noch ein paar Informationen für eine passgenaue Antwort.

1. Auftrag beenden
Der einfachste Weg wäre hier einen bestimmten Eintrag in eine Zelle zu machen, der von dem Schleifenmakro geprüft wird, so dass keine weiteren Tages-Leer-Blöcke kopiert werden.

Im Code ist keine Schleifen-Struktur erkennbar.
Wird das Makro automatisch ausgeführt, wenn die Datei geöffnet wird?
Die Lösungsansätze können jetzt unterschiedlich sein:
a) Dein Schleifen-Makro fragt in einer MsgBox jedesmal ob der Auftrag beendet ist. Bei „Ja“ wird der Ende-Eintrag in die Zelle geschrieben.
b) Du baust noch eine Schaltfläche ein, deren Makro den Ende-Eintrag in die Zelle schreibt
c) Du machst den Eintrag in die Zelle von Hand.

2. Zahlen in Textbox, Punkt als Dezimalzeichen
Um Probleme zu vermeiden/minimieren sollten die Zahlen in Textboxen mit dem Dezimalzeichen eingegeben werden, das in der Systemsteuerung unter den Regions-/Sprachoptionen eingestellt ist.
Da Textboxen die eingegeben Zahlen als Text beinhalten, müssen sie vor der Weiterverarbeitung in Zahlen umgewandelt werden. Weicht das Dezimaltrennzeichen in der Textbox von dem in der Systemsteuerung ab, dann muss dieses vor der Umwandlung in eine Zahl erst ersetzt werden.

Beispiel für 2 Textboxen in einem Userform:

Private Sub CommandButton3\_Click()
 Dim Zahl(1 To 2) As Variant, bolEintragen As Boolean

 'Zahlen in Textboxen prüfen und in Variable(n) merken
 bolEintragen = True
 If fncZahl(strZahl:=Me.TextBoxZahl1, Ergebnis:=Zahl(1), \_
 strInfo:="Zahl1", strDezi:=".") = False Then bolEintragen = False
 If fncZahl(strZahl:=Me.TextBoxZahl2, Ergebnis:=Zahl(2), \_
 strInfo:="Zahl2", strDezi:=".") = False Then bolEintragen = False

 If bolEintragen = True Then
 'Zahlen in Textboxen weiter verarbeiten
 With ActiveSheet 'Worksheets("TabelleXYZ")
 .Cells(2, 3) = Zahl(1)
 .Cells(2, 4) = Zahl(2)
 End With
 End If
End Sub

Function fncZahl(ByVal strZahl As String, ByRef Ergebnis As Variant, \_
 Optional ByVal strInfo As String = "Textbox für Zahl", \_
 Optional strDezi As String) As Boolean
 'gibt Text in Textbox als Zahl zurück
 'leere Textbox --\> Ergebnis = 0
 'abweichendes Dezimaltrennzeichen in Textbox umwandeln in Dezimalzeichen in \_
 Windows-Systemsteuerung
 If strDezi "" Then
 strZahl = VBA.Replace(strZahl, strDezi, Application.International(xlDecimalSeparator))
 End If
 fncZahl = True
 If IsNumeric(strZahl) Then
 Ergebnis = CDbl(strZahl)
 Else
 If strZahl = "" Then
 Ergebnis = 0
 Else
 fncZahl = False
 MsgBox "Eingabe: " & strZahl & vbLf \_
 & "Für """ & strInfo & """ ist keine Zahl eingegeben!" & vbLf \_
 & "Bitte Eingabe korrigieren", vbInformation + vbOKOnly, "Prüfung Zahlen-Eingabe"
 End If
 End If
End Function

Gruß
Franz

Hallo Sonja,

da wirst Du wohl nicht um eine Userform herumkommen, in der Du die Werte eingibst. Wenn Du nicht weisst, wie man eine Userform nutzt, meld Dich noch mal.
Gruß,
Ptonka

Hallo *Sonja*,

klingt jetzt zunächst wie Datenbank, und ich meine, Du mußt eine Beziehung zwischen benutztes Worksheet und den Toleranzgrenzen herstellen.

Das geht z. B. mit einem Array oder einem (ausgeblendetem) Worksheet. Du hast aber immer folgende Arbeiten:
Deklaration Array oder Erstellung Worksheet mit folgenden Feldern:

  • Name Worksheet
  • Toleranz oben
  • Toleranz unten

Dein Code muss dann den Namen des aktuellen Worksheets holen, dann im Array/Tabelle die Werte für Toleranzen holen und dann erst die Formate (italic, Color) setzen.

Hoffe, Du kommst mit dem Denkanstoß erst mal klar. Wenn nicht, dann kontakte mich noch mal.

Gruß
Harry

Hallo Franz,

danke für Deine Hilfe!! Hat mir sehr viel gebracht!! =)

Vielleicht darf ich Dir noch eine letzte kleine Frage stelle?!

Ich habe ein Tabellenblatt in dem ich eine Liste von Produkten habe.
In Zelle A5 steht immer der Produktname, in B5 das Volumen und in C5 das Material.
Per klick auf einen Button lasse ich ein UserForm öffnen in dem ich bei einem neuen Produkt alle wichtigen Daten eingeben kann und es mir automatisch ein neues Tabellenblatt mit diesen drei Variablen als Name erstellt (jeweils mit einem Abstand (Space) dazwischen).
Weiters werden diese drei Variablen in meiner Liste hinzugefügt, wo ich nun per Mausklick auf den Produktnamen in A5 auf das jeweilige Blatt kommen möchte.
Dieser Code fehlt mir noch, da ich nicht weiss, was ich als Adresse im „Hyperlink.Add“ Code eingeben soll.
D.h. ich habe z.B. Textbox1, TB2 und TB3 im UF in denen ich die Variablen eintragen kann, aus denen der Name des neuen Tabellenblattes entsteht und aus denen ich somit auch die Adresse für den Hyperlink zusammen setzten möchte.

Ich hoffe ich habe das verständlich geschrieben…
Ich komme da nämlich auch nicht mehr weiter…

Vielen herzlichen Danke für Deine Hilfe und Mühe!!
Liebe Grüße,
Sonja

Hallo Sonja,

ich nehme an, dass du den Hyperlink zu dem Tabellenblatt des Produkts jeweils in Spalte A in der Zeile einfügen möchtest, in die Daten des Produktes eingetragen werden.

…D.h. ich habe z.B. Textbox1, TB2 und TB3 im UF in denen ich
die Variablen eintragen kann, aus denen der Name des neuen
Tabellenblattes entsteht und aus denen ich somit auch die
Adresse für den Hyperlink zusammen setzten möchte.

Der Code zum Einfügen des Hyperlinks muss etwa wie folgt aussehen:

Private Sub CommandButton1\_Click()
 'Tabelle anlegen, Werte in Liste eintragen, Hyperlink anlegen
 Dim Zeile\_N As Long, strTabName As String
 Dim wksListe As Worksheet, wksNeu As Worksheet
 Set wksListe = ActiveWorkbook.Worksheets("Liste") 'Tabelle mit Produktliste
 With Me
 strTabName = .TextBox1 & " " & .TB2 & " " & .TB3
 End With
 'Neues Blatt für Produkt anlegen
 With ActiveWorkbook 'Arbeitsmappe in der sich die Produktliste befindet
 .Worksheets.Add After:=.Sheets(.Sheets.Count)
 Set wksNeu = .Sheets(.Sheets.Count)
 End With
 'Neues Blatt umbenennen und Daten eintragen
 With wksNeu
 .Name = strTabName
 'nachfolgend Eingaben im neuen Blatt nur zum Testen
 .Cells(2, 1).Value = "Produkt"
 .Cells(2, 2).Value = "Volumen"
 .Cells(2, 3).Value = "Material"
 .Cells(3, 1).Value = Me.TextBox1
 .Cells(3, 2).Value = Me.TB2
 .Cells(3, 3).Value = Me.TB3
 End With 'wksNeu
 'Daten in Produktliste eintragen
 With wksListe
 'nächste freie Zeile in Spalte A
 Zeile\_N = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
 .Cells(Zeile\_N, 1).Value = Me.TextBox1
 .Cells(Zeile\_N, 2).Value = Me.TB2
 .Cells(Zeile\_N, 3).Value = Me.TB3
 'Hyperlink in Spalte A einfügen
 .Hyperlinks.Add Anchor:=.Cells(Zeile\_N, 1), Address:="", \_
 SubAddress:="'" & strTabName & "'!A1", \_
 ScreenTip:="anzeigen Tabelle """ & strTabName & """"
 End With 'wksKiste
 Set wksListe = Nothing: Set wksNeu = Nothing
End Sub

Statt per Hyperlink könntest du die die Produkt-Tabellenblätter auch per Doppelklick in die Zellen mit dem Produktnamen anzeigen.

'Code unter dem Tabellenblatt mit der Produktliste
Private Sub Worksheet\_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 Dim strName As String
 On Error GoTo Fehler
 If Target.Column = 1 And Target.Row \> 4 And Target.Value "" Then
 'aktivieren des Tabellenblattes zum Produkt
 Cancel = True
 With Cells(Target.Row, 1)
 strName = .Text & " " & .Offset(0, 1).Text & " " & .Offset(0, 2).Text
 End With
 ActiveWorkbook.Sheets(strName).Activate
 End If
Fehler:
 With Err
 Select Case .Number
 Case 0 'alles OK
 Case Else
 MsgBox "Tabellenblatt """ & strName & """ ist nicht vorhanden!", \_
 vbInformation + vbOKOnly, \_
 "Tabellenblatt zu Produkt """ & strName & """ anzeigen"
 End Select
 End With
End Sub

Liebe Grüße
Franz

Hallo Franz,

vielen, vielen herzlichen Dank!!
Du hast mir sehr geholfen. Ich habe Deinen Code mit dem Hyperlink verwendet und es funktioniert einwandfrei.
Ich habe gestern schon was ganz ähnliches probiert, aber leider hab ich es nicht so herbekommen wie Du!

Danke Dir vielmals =)

Liebe Grüße,
Sonja

Hallo Franz,

da ist mir noch was eingefallen… wenn ich deine Hilfe vielleicht nochmal haben könnte?

Ich möchte die über die UserForm neu erstellten Datenblätter mit einem Passwort automatisch schützen (also auch mit einem VBA-Code).
Man soll in diesen Datenblättern immer nur die Zellen A31:ECA38 und A75:ECA83 bearbeiten können ohne dass das Fenster mit der Meldung aufgeht, dass dieses Datenblatt/-bereich geschützt ist.

Geht das?
Ich habe etwas annäherndes gefunden, aber leider hilft mir das nicht ganz weiter…

Vielen lieben dank schon im Voraus!!

Liebe Grüße,
Sonja