If you don't have the option of fixing the spreadsheet I would load the data into a SQL table and update it in SQL with the below code.
Load test data
CREATE TABLE FillTest (MyDate date, MyType char(3), MyAccount char(3),
Id INT NOT NULL IDENTITY(1,1))
GO
INSERT INTO FillTest VALUES
('1/1/2014','AAA','111'),
(NULL, NULL, '112'),
(NULL, NULL, '113'),
(NULL, 'BBB','114'),
(NULL, NULL, '115'),
('1/4/2014', 'AAA','116'),
(NULL, NULL, '117'),
(NULL, 'CCC','118')
GO
Fix the data. There is probably a way to do this in a single pass.
-- Fill in missing dates
;WITH FillTest_Dates AS (SELECT MyDate, Id
FROM FillTest
WHERE MyDate IS NOT NULL)
UPDATE FillTest SET MyDate = FillTest_Dates.MyDate
--SELECT *
FROM FillTest
JOIN FillTest_Dates
ON FillTest.Id >= FillTest_Dates.Id
AND FillTest_Dates.Id = (SELECT MAX(Id) FROM FillTest_Dates
WHERE FillTest.Id >= FillTest_Dates.Id)
WHERE FillTest.MyDate IS NULL
GO
-- Fill in missing types
;WITH FillTest_Type AS (SELECT MyDate, MyType, Id
FROM FillTest
WHERE MyType IS NOT NULL)
UPDATE FillTest SET MyType = FillTest_Type.MyType
FROM FillTest
JOIN FillTest_Type
ON FillTest.Id >= FillTest_Type.Id
AND FillTest.MyDate = FillTest_Type.MyDate
AND FillTest_Type.Id = (SELECT MAX(Id) FROM FillTest_Type
WHERE FillTest.Id >= FillTest_Type.Id
AND FillTest.MyDate = FillTest_Type.MyDate)
This will update both in one pass.
;WITH FillTest_Dates AS (SELECT MyDate, Id
FROM FillTest
WHERE MyDate IS NOT NULL),
FillTest_Type AS (SELECT MyDate, MyType, Id
FROM FillTest
WHERE MyType IS NOT NULL)
UPDATE FillTest SET MyDate = FillTest_Dates.MyDate,
MyType = FillTest_Type.MyType
FROM FillTest
JOIN FillTest_Dates
ON FillTest.Id >= FillTest_Dates.Id
AND FillTest_Dates.Id = (SELECT MAX(Id) FROM FillTest_Dates
WHERE FillTest.Id >= FillTest_Dates.Id)
JOIN FillTest_Type
ON FillTest.Id >= FillTest_Type.Id
AND FillTest_Type.Id = (SELECT MAX(Id) FROM FillTest_Type
WHERE FillTest.Id >= FillTest_Type.Id)