A pesar de haberle dado al botón cancelar, te imprime, porque se ejecuta el código que sigue a ese msgbox (cuando se finaliza el selec case).
Aparte de eso, si le das al botón aceptar del msgbox, y por ejemplo, y en celda B17 de la hoja2 tienes algún dato (por ejemplo), te imprimirá 2 veces esa página: una por el "aceptar" del msgbox, y otra por cumplirse lo que hay dentro del bucle "for".
Para solucionar ambas cosas, pon esto:
Código:
Sub Imprimir_solo_si_hay_datos()
Application.ScreenUpdating = False
msbTexto = "Vas a imprimir einnnn? estás seguro?"
msbTitu = "Hola"
msbOpc = vbOKCancel + vbQuestion + vbDefaultButton1
msbRespuesta = MsgBox(msbTexto, msbOpc, msbTitu)
Select Case msbRespuesta
Case vbOK 'Aceptar
Hoja1.Select
For i = 1 To Sheets.Count
If i = 1 Then
If Range("d7") <> "" Then ActiveWindow.SelectedSheets.PrintOut Copies:=1
ElseIf i = 4 Then
If Range("d68") <> "" Then ActiveWindow.SelectedSheets.PrintOut Copies:=1
ElseIf i = 2 Then
If Range("b17") <> "" Then ActiveWindow.SelectedSheets.PrintOut From:=1, To:=1, Copies:=1
If Range("b39") <> "" Then ActiveWindow.SelectedSheets.PrintOut From:=2, To:=2, Copies:=1
If Range("b61") <> "" Then ActiveWindow.SelectedSheets.PrintOut From:=3, To:=3, Copies:=1
If Range("b83") <> "" Then ActiveWindow.SelectedSheets.PrintOut From:=4, To:=4, Copies:=1
End If
If i < Sheets.Count Then ActiveSheet.Next.Select
Next
Case vbCancel 'Cancelar
Sheets("hoja2").Select
Range("A1").Select
'La siguiente línea la puedes poner si deseas que el usuario no sea redirigido a la hoja llamada "menuprincipal"
exit sub
End Select
Sheets("menuprincipal").Select
Range("A1").Select
Application.ScreenUpdating = True
End Sub