¿Como utilizar nombres de rangos en un macro de impresión?

actjfc

Active Member
Joined
Jun 28, 2003
Messages
416
Estimados amigos,

Estoy desarrollando un macro,Test(), que toma un valor de la celda Z10, y si este valor es 3 entonces va a la hoja Sheet1 e imprime el rango nombrado como TESTAREA.

Lo que yo necesito hacer es tener la potestad de reasignar el rango al área TESTAREA y no tener que cambiar el macro cada vez que cambie el área. El macro como esta no funciona ya que no reconoce el rango TESTAREA como un rango o quizás el macro de impresión (MacroforPrinting) esta mal definido. Por ejemplo, TESTAREA puede ser A1:G15 ó cualquier otro rango.

Por favor, ¿Alguien me puede ayudar a localizar los errores?

Gracias,



Dim Area As String
Dim Sh As String

Sub Test()

If Range("Z10") = 3 Then
Sh = "Sheet1"
Area = "TESTAREA"
MacroforPrinting Sh, Area
End If

End Sub

Sub MacroforPrinting(Sh, Area)
With Worksheets(Sh)
With .PageSetup
.PrintArea = Area
.FitToPagesWide = 1
.FitToPagesTall = 1
End With
.PrintOut Copies:=1, Collate:=True
End With
End Sub
 

Excel Facts

Add Bullets to Range
Select range. Press Ctrl+1. On Number tab, choose Custom. Type Alt+7 then space then @ sign (using 7 on numeric keypad)
lo que me funcionó fue:

Sub Test()

If Range("Z10") = 3 Then
Sh = "Sheet1"
Area = [TESTAREA]
MacroforPrinting Sh, Area
End If

End Sub

Sub MacroforPrinting(Sh, Area)
With Worksheets(Sh)
With .PageSetup
.PrintArea = Area
.FitToPagesWide = 1
.FitToPagesTall = 1
End With
.PrintOut Copies:=1, Collate:=True
End With
End Sub

Gracias.
 
Upvote 0
Code:
Option Explicit     '// exige que todos los variables sean declarados
Sub Test()
 
    '// en vez de usar "valores mágicos" enterados dentro del código es
    '// es mejor colocar estos valores como constantes en el inicio
    '// asi es más fácil controlar para el futuro.
 
    Const c_strSheetName As String = "Sheet1"
    Const c_strAreaName As String = "TestArea"
    Const c_strRangeToCheck As String = "RangeToCheck"  '// Cell Z10
 
    Dim strOldAddress As String
 
    If Range(c_strRangeToCheck) = 3 Then
 
        strOldAddress = Range(c_strAreaName).Address
 
        MacroforPrinting c_strSheetName, c_strAreaName
 
        Names(c_strAreaName).RefersTo = "=$A$2:$C$4"
        MacroforPrinting c_strSheetName, c_strAreaName
 
        Names(c_strAreaName).RefersTo = "=" & strOldAddress
 
    End If
 
End Sub
 
Sub MacroforPrinting(ByVal strSheet, ByVal strArea)
    With Worksheets(strSheet)
        With .PageSetup
            .PrintArea = strArea
            .FitToPagesWide = 1
            .FitToPagesTall = 1
        End With
        .PrintPreview
        '.PrintOut Copies:=1, Collate:=True
    End With
End Sub

Unos pensamientos que no cupieron en comentarios:

Si usted va a usar variables al nivel del módulo, entonces no tiene que pasarlos a la segunda rutina. En cambio se vas a pasarlos a la segunda rutina, pueded ser declarados dentro de la rutina. En este caso, puse BYVAL para que sean copias y cambios no se reflejan en la rutina madre.

Además, use "Hungarian Notation" para que sea más obvio qué tipo es cada variable.

Y de último, favor use la etiquetas CODE cuando está poniendo VBA. Es mucho más fácil leer asi.

<SUP>edit</SUP> Se me olvido mencionar algo. También uso una celda nombrado en vez de la dirección «Z10». Asi es más robusto. Si uno pone una dirección y después se inserta o se suprime filas y/o columnas con suerte su macro va a tirar un error. Sin suerte su macro corre pero brinda resultados erroneos. En su ejemplo no es gran cosa, pero en otras cosas un error asi puede ser muy grave. <SUB>/edit</SUB>
 
Last edited:
Upvote 0

Forum statistics

Threads
1,223,970
Messages
6,175,710
Members
452,667
Latest member
vanessavalentino83

We've detected that you are using an adblocker.

We have a great community of people providing Excel help here, but the hosting costs are enormous. You can help keep this site running by allowing ads on MrExcel.com.
Allow Ads at MrExcel

Which adblocker are you using?

Disable AdBlock

Follow these easy steps to disable AdBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the icon in the browser’s toolbar.
2)Click on the "Pause on this site" option.
Go back

Disable AdBlock Plus

Follow these easy steps to disable AdBlock Plus

1)Click on the icon in the browser’s toolbar.
2)Click on the toggle to disable it for "mrexcel.com".
Go back

Disable uBlock Origin

Follow these easy steps to disable uBlock Origin

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back

Disable uBlock

Follow these easy steps to disable uBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back
Back
Top