Lets walk through one case. You press the switch connected to pin 2 on the Arduino. The Arduino sends "R5" to the serial port, along with a carriage return and line feed, and flashes the LED on pin 7.
While not running the VB app, open the Serial Monitor. You should see R5 in the serial monitor window, on a new line, and the LED on pin 7 should flash every time you press the switch connected to pin 2. Do both of those things happen?
Presuming that they do, close the Serial Monitor, and run the VB application.
When the Arduino sends R5, the MSComm1_OnComm() method should be called. The method detects that a receive event is what woke it up, so it reads the data that has arrived. storing it in strData. It then appends that data to whatever is in strBuffer.
It then executes a loop until some condition is true. In the loop, it tests for a carriage return and line feed in the input data. If none is present, you have an infinite loop, from which you never can exit. The do/loop Until stuff is useless. Get rid of it.
Presuming that there IS a carriage return and line feed in the buffer, you proceed to split strBuffer (which contains "R5" at each space, to create an array of words. Oops, there are no spaces, so the array is only going to contain one word. More useless code to get rid of.
Then, you convert the first (and only) word to upper case. More silliness, since the string sent was all uppercase to begin with.
Finally, you have a set of cases that you hope "R5" might match. These include "#R5", "G10", etc.
None of the cases include , so none of the cases will ever match.
You tested that the serial string contained . When you determined that the string did, the proper next step was to remove them. Trim(), Left(), etc.
Nowhere in the Arduino code do you send a '#', so none of the cases with # in them will ever be true.