I have the following columns and values:
Begin Time Other values First Name Last Name other info
5041* value1 info1
5041* value2 firstname1 lastname1 info2
13089 value3 info3
16130 value4 info4
26391* value5 info5
26391* value6 info6
26391* value7 firstname2 lastname2 info7
27878 value8 info8
27878 value9 info9
28234 value10 info10
63189* value11 info11
63189* value12 info12
63189* value13 info13
63189* value14 firstname3 lastname3 info14
64335 value15 info15
65423 value16 info16
72089* value17 info17
72089* value18 firstname4 lastname4 info18
73495 value19 info19
73495 value20 info20
74330 value21 info21
74877 value22 info22
76710 value23 info23
82599* value24 info24
82599* value25 firstname5 lastname5 info25
98712* value26 info26
98712* value27 firstname6 lastname6 info27
98725 value28 info28
100605 value29 info29
100605 value30 info30
100954 value31 info31
I expect this:
Begin Time Other values First Name Last Name other info
5041 value1 firstname1 lastname1 info1
5041 value2 firstname1 lastname1 info2
13089 value3 firstname1 lastname1 info3
16130 value4 firstname1 lastname1 info4
26391 value5 firstname2 lastname2 info5
26391 value6 firstname2 lastname2 info6
26391 value7 firstname2 lastname2 info7
27878 value8 firstname2 lastname2 info8
27878 value9 firstname2 lastname2 info9
28234 value10 firstname2 lastname2 info10
63189 value11 firstname3 lastname3 info11
63189 value12 firstname3 lastname3 info12
63189 value13 firstname3 lastname3 info13
63189 value14 firstname3 lastname3 info14
64335 value15 firstname3 lastname3 info15
65423 value16 firstname3 lastname3 info16
72089 value17 firstname4 lastname4 info17
72089 value18 firstname4 lastname4 info18
73495 value19 firstname4 lastname4 info19
73495 value20 firstname4 lastname4 info20
74330 value21 firstname4 lastname4 info21
74877 value22 firstname4 lastname4 info22
76710 value23 firstname4 lastname4 info23
82599 value24 firstname5 lastname5 info24
82599 value25 firstname5 lastname5 info25
98712 value26 firstname6 lastname6 info26
98712 value27 firstname6 lastname6 info27
98725 value28 firstname6 lastname6 info28
100605 value29 firstname6 lastname6 info29
100605 value30 firstname6 lastname6 info30
100954 value31 firstname6 lastname6 info31
I am using the following code thanks to @Jeeped's answer
Sub FillColBlanksSpecial2()
Dim wks As Worksheet
Dim rng As Range
Dim rng2 As Range
Dim blnk As Range
Dim LastRow As Long
Dim col As Long
Dim lRows As Long
Dim lLimit As Long
Dim lCount As Long
On Error Resume Next
lRows = 2
lLimit = 1000
Set wks = ActiveSheet
For Each wks In Worksheets
If Right(wks.Name, 2) = "-A" Or Right(wks.Name, 2) = "-B" Then
With wks
With .Cells(1, 1).CurrentRegion
With .Columns("C:D")
If CBool(Application.CountBlank(.Cells)) Then
For Each blnk In .SpecialCells(xlCellTypeBlanks)
blnk.FormulaR1C1 = "=if(countifs(r1c1:r[-1]c1, rc1, r1c:r[-1]c, ""<>""), index(r1c:r[-1]c, match(rc1, r1c1:r[-1]c1, 0)), if(countifs(r[1]c1:r9999c1, rc1, r[1]c:r9999c, ""<>""), index(r[1]c:r9999c, match(rc1, r[1]c1:r9999c1, 0)), r[-1]c))"
blnk.Value = blnk.Value
Next blnk
End If
End With
End With
End With
End If
Next wks
End Sub
with the formula in xlR1C1 style and its xlA1 equivalent:
=IF(COUNTIFS(R1C1:R[-1]C1, RC1, R1C:R[-1]C, "<>"), INDEX(R1C:R[-1]C, MATCH(RC1, R1C1:R[-1]C1, 0)), IF(COUNTIFS(R[1]C1:R9999C1, RC1, R[1]C:R9999C, "<>"), INDEX(R[1]C:R9999C, MATCH(RC1, R[1]C1:R9999C1, 0)), R[-1]C))
=IF(COUNTIFS($A$1:$A1, $A2, C$1:C1, "<>"), INDEX(C$1:C1, MATCH($A2, $A$1:$A1, 0)), IF(COUNTIFS($A3:$A$9999, $A2, C3:C$9999, "<>"), INDEX(C3:C$9999, MATCH($A2, $A3:$A$9999, 0)), C1))
The goal is to fill up and down the columns C:D with the existing values based on the conditions:
1. Take the values in C:D and fill down until the next non-empty cell in the same columns.(these non-empty cells contain unique values, firstname1, firstname2, etc)
2. Take the values in C:D and fill up if the empty row(s) above share the same value in Column A with the row which is below and whose values we are coping up.
@Jeeped's answer is working correctly:
it takes the values from columns C:D and fills down the empty rows until the next row that contains new values; it also fills up one empty row if the that empty row shares the same value in column A with the row below that contains the to-be-copied values.
but it only fills up one row. My example data (link below) shows that there might be more than one empty row above the rows that contain values in column C:D that need to be filled up.
How to modify this vba code to accommodate this condition?
P.S. the asterisk mark besides the codes in first column are solely for the purpose of the visual accessibility to identify the empty rows that share the same value in column A with the row below that has values in columns C:D; otherwise they don't appear in the original data sheet.
By empty row, I mean those rows which don't have values in columns C:D.
I've complicated the formula a bit more to achieve the vertical lookup to more than a single column. The single line that needs modification is in the center of all the nested code.
That translates to an xlA1 style formula like the following (as seen from C2).
Note that the coded formula requires doubling up the quotes within the quoted string.