This will work. I put all of your /did commands into an alias just to reduce the size of your script. I know that OP/DEOP/etc don't need to fill all spaces, but it won't hurt. I have it set in the alias so that if the dialog isn't open, it won't do anything. If you'd rather have it open the dialog automatically, you can change RETURN to your DIALOG command.

Code:
dialog chan_stat  {
  title Stats
  size -1 -1 128 64
  option dbu
  box "User Stats", 16, 6 3 113 40
  text "&Ops:", 4, 10 14 11 8
  edit "", 1, 23 12 14 12, read
  text "&Voiced:", 5, 42 14 18 8
  edit "", 2, 62 12 14 12, read
  text "&Regular:", 6, 80 14 20 8
  edit "", 3, 102 12 14 12, read
  text "Total Number of Users:", 29, 13 30 59 8
  edit "", 30, 75 27 18 13, read
  button "&Done", 20, 45 48 37 12, ok
}
on *:dialog:chan_stat:init:*:{
  FillStats
}
on *:OP:%test.chan:{
  FillStats
}

on *:DEOP:%test.chan:{
  FillStats
}

on *:voice:%test.chan:{
  FillStats
}

on *:devoice:%test.chan:{
  FillStats
}

on *:JOIN:%test.chan: {
  FillStats
}

on *:PART:%test.chan:{
  FillStats
}

on *:KICK:%test.chan:{ 
  FillStats
}

on *:QUIT:{
  FillStats
}
 
alias FillStats {
  if (!$dialog(chan_stat)) { return }
  .timer 1 0 did -ra chan_stat 1 $!nick(%test.chan,0,o)
  .timer 1 0 did -ra chan_stat 2 $!nick(%test.chan,0,v)
  .timer 1 0 did -ra chan_stat 3 $!nick(%test.chan,0,r)
  .timer 1 0 did -ra chan_stat 30 $!nick(%test.chan,0)
}