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, 16:58 (Dieser Beitrag wurde zuletzt bearbeitet: 29.05.2017, 17: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, 11:07 (Dieser Beitrag wurde zuletzt bearbeitet: 13.06.2017, 11: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