danke für deine Antwort! Ich habe jetzt die Makros aktiviert und deinen Code eingefügt und ausgeführt. Dieser hat alle Fälle rot marktiert, in denen die 1 nicht vorkommt. Jetzt muss ich also noch den Teil, der eine der Zahlen außer der 0 ersetzt, einfügen richtig?
29.05.2017, 15:58 (Dieser Beitrag wurde zuletzt bearbeitet: 29.05.2017, 16:18 von atilla.
Bearbeitungsgrund: Zeile korrigiert: For i = LBound(ati) To UBound(ati) - 2 Step 4
)
Hallo,
ich habe Günthers Code so verändert, dass er noch zusätzlich die Spalte F markiert:
Code:
Sub FindMissingNumber()
Dim lRow As Long, Status As Boolean
Dim Ze As Long, rngBlock As Range, c As Range
With UsedRange
.Interior.Color = xlNone
.Font.ColorIndex = xlAutomatic
.Borders(xlEdgeBottom).LineStyle = xlNone
End With
lRow = Cells(Rows.Count, 5).End(xlUp).Row
For Ze = 2 To lRow Step 4
Set rngBlock = Range(Cells(Ze, 5), Cells(Ze + 3, 5))
Status = False
Range(Cells(Ze + 3, 5), Cells(Ze + 3, 6)).Borders(xlEdgeBottom).Weight = xlMedium
For Each c In rngBlock
If CInt(c) = 1 Then
Status = True
Exit For
End If
Next c
If Not Status Then
With rngBlock.Resize(, 2)
.Interior.Color = rgbLightBlue
.Font.Color = rgbRed
End With
End If
Next Ze
End Sub
Unten der Code mach dann das, was Du haben möchtest. Günthers Code mit meiner Erweiterung dient lediglich zur optischen Prüfung.
Die Spalte E belasse ich, wie sie ist und schreibe die Ersetzung in Spalte F.
Das ist der Code:
Code:
Sub ersetzen()
Dim lngZ As Long, i As Long, n
Dim ati
Dim lngStelle As Long
Dim boVar As Boolean
lngZ = Cells(Rows.Count, 5).End(xlUp).Row
ati = Range("E2:E" & lngZ)
For i = LBound(ati) To UBound(ati) - 2 Step 4
n = 0
Do
If ati(n + i, 1) = 1 Then
Exit Do
End If
n = n + 1
Loop Until n = 4
If n = 4 Then
Do
Randomize
lngStelle = Int((4 * Rnd) + 1)
Loop Until ati(lngStelle - 1 + i, 1) <> 0
ati(lngStelle - 1 + i, 1) = 1
End If
Next i
Range("F2:F" & lngZ) = ati
End Sub
So sieht es dann aus, wenn zuerst Günthers Code und dann mein Code ausgeführt wird:
Arbeitsblatt mit dem Namen 'Seq_Dist_CBC2_CBCPSS_Design'
vielen Dank für deinen Code! Ich habe die Spalte E durch die von dir erzeugte F ersetzt und die .csv in Sawtooth importiert. Es passt perfekt, das erste Attribut-Level kommt in jedem Task vor. Vielen Dank für die schnelle Hilfe!
Warum fragst Du nicht im Forum weiter? Das Forum lebt von Fragen und Antworten.
Bitte denk beim nächsten mal daran.
Dein Problem sollte mit Änderung folgender Zeile gelöst werden können:
statt:
13.06.2017, 10:07 (Dieser Beitrag wurde zuletzt bearbeitet: 13.06.2017, 10:07 von snb.)
Oder ?
Code:
Sub M_snb()
sn = Columns(5).SpecialCells(2).Offset(10).SpecialCells(2)
For j = 1 To UBound(sn) Step 4
If j + 3 > UBound(sn) Then Exit For
If IsError(Application.Match(1, Application.Index(sn, Evaluate("row(" & j & ":" & j + 3 & ")"), 1), 0)) Then
For jj = j To j + 3
If sn(jj, 1) <> 0 Then Exit For
Next
sn(jj, 1) = 1
End If
Next
Columns(5).SpecialCells(2).Offset(10).SpecialCells(2).Offset(, 2) = sn
End Sub
Sub M_snb()
sn = Columns(5).SpecialCells(2).Offset(9).SpecialCells(2)
For j = 1 To UBound(sn) Step 4
If j + 3 > UBound(sn) Then Exit For
If InStr(sn(j, 1) & sn(j + 1, 1) & sn(j + 2, 1) & sn(j + 3, 1), "1") = 0 Then
For jj = j To j + 3
If sn(jj, 1) <> 0 Then Exit For
Next
sn(jj, 1) = 1
End If
Next
Columns(5).SpecialCells(2).Offset(9).SpecialCells(2).Offset(, 2) = sn
End Sub
vielen Dank an Atilla und snb für die Ergänzungen!
Ich habe nun noch ein zweites Conjoint Design, in dem die "1" in der Spalte E pro Fünferblock einmal vorkommen soll, dieses Mal ab Zeile 2. Dieses Mal gibt es also fünf Konzepte (siehe Spalte C) von denen eines in Spalte E den Wert "1" annehmen soll. Die Formel soll prüfen, ob in den jeweils fünf Zeilen der Spalte E eine "1" vorkommt. Ist dies nicht der Fall, soll sie eine der fünf Zellen mit "1" überschreiben. Wie gehabt darf dies nicht die "0" sein. Nun gibt es allerdings noch eine weitere Einschränkung: Die überschriebene Zelle der Spalte E darf in der Spalte D derselben Zelle nicht den Wert "4" haben.
Im Anhang findet Ihr die entsprechende Tabelle, ich habe von Zeile 107-111 einen betroffenen Fünferblock gelb markiert. Rot hab ich sowohl die 0 markiert, als auch den Fall, in dem die Spalte D den Wert "4" hat. Falls es die Programmierung erleichtert: Die nicht zu überschreibenden Nullen haben in der Spalte D immer den Wert "5". Mann könnte also auch sagen, dass in der Spalte E nur überschrieben werden darf, was in Spalte D derselben Zeile weder "4" noch "5" ist.
Vielen Dank für Eure Hilfe und einen schönen Sonntag!
Colin