Una primer a aproximación sería que pidieras el nombre de la carpeta mediante un inputbox, por ejemplo:
Sub visor()
dim miCarpeta as String
miCarpeta=InputBox("Escriba el nombre de la carpeta que contiene el archivo")
If StrPtr(miCarpeta) = 0 OR Nz(miCarpeta,"")="" Then Exit Sub
carpeta = "\\Cultivos3\Ir a Sala\" & miCarpeta & "\"
archivo = "Lunes.jpg"
ShellExecute 0, "open", carpeta & archivo, "", "", 1
End SubUna segunda opción sería utilizar el objeto FileDialog, que abrirá una ventana emergente en la que puedes seleccionar la carpeta.
Para esto, copia esta función en un módulo nuevo:
'------------------------------------------------------------------------------------------------
' Función para abrir ventana de diálogo y elegir la carpeta donde exportar la documentación
'------------------------------------------------------------------------------------------------
Public Function fncSelectCarpeta() As String
On Error GoTo sol_err
Dim fDialog As Office.FileDialog
miRuta = Application.CurrentProject.Path
'Creamos el Objecto FileDialog
Set fDialog = Application.FileDialog(msoFileDialogFolderPicker)
'Configuramos las características de nuestra ventana de diálogo
With fDialog
.Title = "Selecciona la carpeta donde se va a exportar el archivo"
.ButtonName = "Aceptar"
.InitialView = msoFileDialogViewList
.InitialFileName = miRuta & "\"
'Detectamos el botón pulsado por el usuario
If .Show = -1 Then
'Asignamos a la función la carpeta seleccionada, convirtiéndola a un valor de tipo String
fncSelectCarpeta = CStr(.SelectedItems.Item(1))
Else
'No hacemos nada
End If
End With
Salida:
Exit Function
sol_err:
MsgBox "Se ha producido el error: " & Err.Number & " - " & Err.Description, vbInformation,"ERROR"
Resume Salida
End Function
El siguiente paso es registrar la librería “Microsoft Office xx.x Object Library"
Por último, tu código quedaría así:
Sub visor()
carpeta = fncSelectCarpeta()
If Nz(carpeta,"")="" Then Exit Sub
archivo = "Lunes.jpg"
ShellExecute 0, "open", carpeta & "\" & archivo, "", "", 1
End Sub