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 Sub
Una 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