So..I guess he has to go through console?
That depends on what the macro does
In the example I gave, the macro types "u @ " (without the quotes). 'u' is my ingame keybind to open teamchat.
Since my macro uses the game's keybind, I don't have to have the console opened.
Reading what you have written, his macro types "say @ lol noob". Since 'say' is a console command, he'll have to have the console open.
Try a macro that types "y @ lol noob [ENTER]", if y is your/his bind for 'say'
Anotherthing to keep in mind is the delays between keystrokes. The keyboards software can 'press' buttons reeeeeeeally fast. In fact, too fast for CS:S to notice.
My macro has a delay between every single action (NOTE: 'Key down' and 'Key up' are two different commands. depending on the machine's performance/lag you'll have to tweak those delays a bit. (0.1 sec works for me 99% of the time)
However, if you want to 'call' commands that normally have to be typed in console, the macro has to do it too. Hence you'll have to open up the console in the macro first (read: hit the key you've bound to open up the console), and close console afterwards.