There are a few different ways to handle this type of situation.
If you plan to approach it directly (as you've asked, and as I'll discourage), then first and foremost, you'll have to handle the issue of when events fire, and to ensure that the dependent events fire and set values subsequent to the routines that they depend on.
This is a challenge. I would approach this by putting the "guts" of the uc that the other is going to depend on in that guy's "page_init" event. This will fire first.
Then, in the dependent uc, put the dependent routines in the page_load or some other subsequent event. These will fire after the other's page_init, and make sure that the values have been set.
Then, you have to ask, "Where will I put these values, and how will I access them?"
Well, you could store them in session. That would probably be the least painful method, but then you have scalability questions to consider.
You may choose to expose these values through properties, and then give declarations of the "parent" (for lack of a better term) in the dependent uc... I'm not entirely sure this method will work, but you might give it a go.
So like I said, I'm going to discourage all of this non-sense and instead, suggest that you handle the passing of values between uc's via your main page class. You will find it much easier to control and manage your variables if you take this approach.
So, I would nix the page_load events in both uc's, and opt for my own personal "loadIt()" subroutine which can be called explicitly from the main page. You absolutely guarantee firing order if you go for this method.
You put all logic into the loadIt() subs, load the uc's programatically from the main page class, and pull variables out once you call those subs via properties that you expose.
So, for instance. Let's say uc2 depends on a variable from uc1 called 'myVar'. Then your code might look like this:
Code:
'dim needed vars
dim uc1 as uc1
dim uc2 as uc2
dim myVar as integer
'new up uc1
uc1 = loadControl("userControls/uc1.ascx")
'fire logic
uc1.loadIt()
'pull variable
myVar = uc1.myVar
'add uc1 to a placeholder on the page
myPlaceholder1.Controls.Add(uc1)
'new up uc2
uc2 = loadControl("userControls/uc2.ascx")
'assign myVar that you retrieved from uc1
uc2.myVar = myVar
'fire logic, which assumably will use value of myVar
uc2.loadIt()
'add uc2 to another placeholder on the page
myPlaceholder2.Controls.Add(uc2)
Hopefully, it's pretty clear to you why I suggest this route. I prefer the total control of this method, as opposed to the hit-or-miss proposition that I outlined first.
hth!

paul