Let me try to explain more clearly now that I am at my PC.
Dim but(64) As Button
K=0
Declares your array of Buttons and initialises k which is used as the index pointer into the array.
For x = 0 To 7
For y = 0 To 7
but(k).Initialize("But")
panel1.AddView(but(k),9.5%x + (x*10.2%x),14.5%y + (y*7.8%y),10.3%x,7.8%y)
but(k).Tag = (k)
K=k+1
Next
Next
Loops through all 64 Buttons, I'm guessing that your creating a grid of Buttons. This is your original code all that I adjusted was k. On the first iteration k=0 and so we initialise but(0) and add the view to the Panel along with setting the Tag value to 0. The important bit that I added was at the end of the inner For Next loop k=k+1 this now means that we point to but(1) on the next iteration, then 2 and 3 and so on.
You have assigned the same event to all buttons and so the following sub handles any but(0) to but(64) click event. Only one Button can be clicked at any point in time and handled using this sub.
Sub But_Click
Dim but As Button = Sender
Now "but" holds a reference to which ever button was pressed whether it be but(0) or but(23) etc. You do not necessarily need to read the tag value and then point directly to the actual Button as done here...
Dim btnid As Int = but.Tag
Select a
Case 0
b = btnid
a = a + 1
but(b).Visible = False
Instead you could just use but.Visible=False and achieve the same thing.
However you are clearly trying to index another Button in the Array with "but(c)" and I did not know where "a" originated from or your intention at this point which is why I left your original code intact. To be honest it doesn't make a great deal of sense to me as "but(b).Visible" and "but(c).Visible" both appear to reference the same Button?
I have not downloaded your code so this may well have changed since your first post. Hopefully what I have written has helped to explain how Sender is referencing the actual Button that was clicked.