To put it another way, your code will only work if, for any 'i', there exists a control by the name generated by the expression, ("Giro" & i).
If this expression does not produce the string-value you expect, or no such object exists... then the statement has no choice but to raise a runtime exception and it may not be a terribly readable one. In this case it definitely isn't.
What I usually do in setting-up such code is to deliberately simplify the statement into several. I might deliberately set a temporary variable to the Controls() entry in the first statement, then use the variable to reference the control in the next statement. I deliberately use two statements to do the work of one. Why? Because it produces better error-messages.
The language is going to compile or at least semi-compile the statements into more-or-less the same executable code no matter how (within reason...) I write it. Computers are so darned fast that a little "inefficiency" won't be noticed. But it might make the program considerably easier to debug, or to extend in the future.