Option Explicit
Sub Graph_To_XY_Table()
On Error GoTo User_Cancelled
Dim graph As Range
Set graph = Select_Cells("Select around graph (including X and Y labels) and then press ENTER.")
Dim topRightCorner As Range
Set topRightCorner = graph(1, graph.Columns.Count)
With topRightCorner
.Offset(0, 2).Value = "x"
.Offset(0, 3).Value = "y"
.Offset(0, 4).Value = "f(x)"
.Offset(0, 5).Value = 0
.Offset(-1, 5).Value = "Index"
Range(.Offset(0, 2), .Offset(0, 5)).Interior.Color = RGB(255, 255, 0)
Range(.Offset(0, 2), .Offset(0, 5)).HorizontalAlignment = xlCenter
Range(.Offset(0, 2), .Offset(0, 5)).VerticalAlignment = xlCenter
Dim firstXCellAddress As String
firstXCellAddress = Replace(.Offset(1, 2).Address, "$", "") 'I8
Dim firstYCellAddress As String
firstYCellAddress = Replace(.Offset(1, 3).Address, "$", "") 'J8
Dim cellAddressOf0 As String
cellAddressOf0 = Replace(.Offset(0, 5).Address, "$", "") 'L7
Dim firstIndexCellAddress As String
firstIndexCellAddress = Replace(.Offset(1, 5).Address, "$", "") 'L8
Dim graphRangeAddress As String
graphRangeAddress = graph.Address 'Graph_01
'X formula
.Offset(1, 2).Formula2 = "=IF(" & firstIndexCellAddress & "<>" & Chr(34) & Chr(34) & ",INT((" & firstIndexCellAddress & "-1)/(ROW(INDEX(" & graphRangeAddress & ",ROWS(" & graphRangeAddress & "),COLUMNS(" & graphRangeAddress & ")))-ROW(INDEX(" & graphRangeAddress & ",1,1))-1))," & Chr(34) & Chr(34) & ")"
'Y formula
.Offset(1, 3).Formula2 = "=IF(" & firstIndexCellAddress & "<>" & Chr(34) & Chr(34) & ",MOD(" & firstIndexCellAddress & "-1,ROW(INDEX(" & graphRangeAddress & ",ROWS(" & graphRangeAddress & "),COLUMNS(" & graphRangeAddress & ")))-ROW(INDEX(" & graphRangeAddress & ",1,1))-1)," & Chr(34) & Chr(34) & ")"
'f(x) formula
.Offset(1, 4).Formula2 = "=IF(" & firstIndexCellAddress & "<>" & Chr(34) & Chr(34) & ",INDEX(" & graphRangeAddress & ",ROW(INDEX(" & graphRangeAddress & ",ROWS(" & graphRangeAddress & "),COLUMNS(" & graphRangeAddress & ")))-ROW(INDEX(" & graphRangeAddress & ",1,1))-1-" & firstYCellAddress & "+1," & firstXCellAddress & "+2)," & Chr(34) & Chr(34) & ")"
'Index formula
.Offset(1, 5).Formula2 = "=IFERROR(IF(" & cellAddressOf0 & "+1<=(ROW(INDEX(" & graphRangeAddress & ",ROWS(" & graphRangeAddress & "),COLUMNS(" & graphRangeAddress & ")))-ROW(INDEX(" & graphRangeAddress & ",1,1))-1)*(COLUMN(INDEX(" & graphRangeAddress & ",ROWS(" & graphRangeAddress & "),COLUMNS(" & graphRangeAddress & ")))-COLUMN(INDEX(" & graphRangeAddress & ",1,1))-1)," & cellAddressOf0 & "+1," & Chr(34) & Chr(34) & ")," & Chr(34) & Chr(34) & ")"
'Fill them down:
Dim numberOfCoordinates As Long
numberOfCoordinates = (graph(graph.Rows.Count, 1).Row - graph(1, 1).Row - 1) * (graph(graph.Rows.Count, graph.Columns.Count).column - graph(1, 1).column - 1)
Range(.Offset(1, 2), .Offset(1 + numberOfCoordinates, 5)).Formula = Range(.Offset(1, 2), .Offset(1, 5)).Formula
'Remove the formulaii
Range(.Offset(1, 2), .Offset(1 + numberOfCoordinates, 5)).Formula = Range(.Offset(1, 2), .Offset(1 + numberOfCoordinates, 5)).Value
End With
User_Cancelled:
End Sub
Function Select_Cells(message As String)
On Error GoTo Exit_Function
Dim Selectedarea As Range
Set Selectedarea = Application.InputBox(prompt:=message & vbNewLine & vbNewLine & vbNewLine & vbNewLine, _
Title:="Select Range", Default:=Selection.Address, Type:=8)
If Not Selectedarea Is Nothing Then Set Select_Cells = Selectedarea
Exit_Function:
End Function