…if Chris does agree, this routine handles hidden rows (treats them as if they didn't exist, regardless of what values they might hold) and doesn't attempt to fill anything in if the topmost/bottommost values are 'N/A'.
It's only half way through development - there are too many loops, too many steps - I'll make it leaner and meaner if Chris thinks it's a path he'd like to follow.
Sub blah()
'CopySheet1
With Range("A2:F8") ' <<< will need adjusting/automating.
columnCount = .Columns.Count
Set RngColm1 = .Columns(1).SpecialCells(xlCellTypeVisible)
RowCount = RngColm1.Cells.Count
ReDim vis(1 To RowCount, 1 To .Columns.Count)
c = 0
For Each colm In .Columns
c = c + 1
Set x = colm.SpecialCells(xlCellTypeVisible)
r = 0
For Each cll In x.Cells
r = r + 1
vis(r, c) = cll.Value
Next cll
Next colm
For c = 2 To UBound(vis, 2)
For r = 2 To UBound(vis) - 1
If IsNumeric(vis(r - 1, c)) And vis(r, c) = "N/A" Then FillStart = r
If IsNumeric(vis(r + 1, c)) And vis(r, c) = "N/A" Then Fillend = r
If FillStart > 0 And Fillend > 0 Then
Debug.Print c, FillStart, Fillend
x1 = Empty: x2 = Empty
x1 = CDbl(vis(FillStart - 1, 1)): x2 = CDbl(vis(Fillend + 1, 1))
y1 = Empty: y2 = Empty
y1 = vis(FillStart - 1, c): y2 = vis(Fillend + 1, c)
For ro = FillStart To Fillend
zz = Application.WorksheetFunction.Forecast_Linear(vis(ro, 1), Array(y1, y2), Array(x1, x2))
If vis(ro, c) = "N/A" Then vis(ro, c) = zz
Next ro
FillStart = 0: Fillend = 0
End If
Next r
Next c
End With
ro = 0
For Each cll In RngColm1.Cells
ro = ro + 1
'cll.Offset(, 1).Resize(, columnCount - 1).Select
co = 1
For Each celle In cll.Offset(, 1).Resize(, columnCount - 1).Cells
co = co + 1
'celle.Select
If celle.Value = "N/A" Then celle.Value = vis(ro, co)
Next celle
Next cll
End Sub