Have not considered this before, but it looks like a ListObject column range property as follows:
Dim wks As Worksheet Set wks = ActiveSheet Dim li As ListObject Set li = wks.ListObjects(1) Dim col As ListColumn Set col = li.ListColumns(2) ' assuming column 2 of the table has a calculated formula Dim r As Range Set r = col.DataBodyRange Let b = Not IsNull(r.FormulaArray) if b then Let b = Len(r.FormulaArray) > 0 ' case where r.FormulaArray = "", suspect it not a calculated column End If MsgBox b
if IsNull (r.FormulaArray), then it does not have a calculated column, otherwise it does it.
Hth
Well, playing around with this a bit, and I see that the range object obtained using the above is different from the range object for any given cell, so if you have a given cell, I think you will need to get the corresponding ListColumn range through. DataBodyRange.
(For example, if you paste Set r = r.Cells(1,1) into the above, then the IsNull(r.FormulaArray) test IsNull(r.FormulaArray) no longer works to check the calculated column, but instead simply says if the range has a formula, but it can would be to calculate or not.)
Also, while r.FormulaArray is represented as a string when a column is being computed, if it is not (a computed column), then .FormulaArray gives null, which is not a valid string value (which makes it difficult to use this to capture the value you should use, not logical); I found that IsNull (r.FormulaArray) is working fine.
If I add a column to the right of an already calculated column, then r.FormulaArray = "" for this newly added column. If you put a value in one of its cells, the array of formulas immediately returns to the more expected NULL. So, I added a test for what I consider to be false.