1) A function is designed to return a function result; furthermore a function "can take arguments, perform a series of statements, and even change the values of its arguments" - c.f.Function statement.
By using Debug.Print cellv(j, 1) your function (as it is coded) returns a cell value (predefined by passed row/col arguments) as function result, whereas coding Debug.Print cellv(j, 1) = "aa" would check if the function result equals "aa" and write a True or False value.
2) A function result consisting of a cell value is not designed to receive itself an outer value assignment like e.g. via cellv(j, 1) = "aa". In your case you get a run time error 424 "Object needed."
- If, however you want to assign values to a range you might prefer a
Sub procedure or if you want to stick to your function, set it to memory as Range like in @MGonet 's post.