Несколько мыслей о вашем коде:
Dim MySheet As String
Как mySheet
относится к имени листа, проясните это.
Переименуйте переменную в Dim mySheetName as String
Set ReportSheet = Sheets (MySheet)
При задании ссылки на лист отчета используйте полный квилинг к объекту.
Добавьте Set reportSheet = ThisWorkbook.Worksheets(mySheetName)
I попытался использовать следующую логику c, но она не сработала, поскольку я не могу вставить "как часть именования, чтобы правильно создать мою переменную.
Чтобы вставить символ двойной кавычки, вы можете использовать: char(34)
например TEST1 = "(" & Chr(34) & ThisWorkbook.Sheets("Sheet1").Range("C8").Value & ThisWorkbook.Sheets("Sheet1").Range("D8").Value & Chr(34) & ")"
Теперь о запрос:
Вы можете сделать это более коротким способом, но я выбрал этот более длинный путь, чтобы проиллюстрировать идею.
- Соберите информацию о настройках
- Установить ссылку на столбцы и строки
- Найти пересечение между ними
- Искать непустые ячейки в этом диапазоне и скрывать их столбцы и строки
Код:
Public Sub DynamicallyHideCells()
Dim settingsSheet As Worksheet
Dim reportSheet As Worksheet
Dim targetColumnsRange As Range
Dim targetRowsRange As Range
Dim targetRange As Range
Dim targetCell As Range
Dim reportSheetName As String
Dim reportColumnsAddr As String
Dim reportRowsAddr As String
' Set a reference to the settings sheet
Set settingsSheet = ThisWorkbook.Worksheets("Sheet1")
' Gather the report sheet's name
reportSheetName = settingsSheet.Range("C7").Value
' Check the : between the two cells reference
reportColumnsAddr = settingsSheet.Range("C8").Value & ":" & settingsSheet.Range("D8").Value
' Check the : between the two cells reference
reportRowsAddr = settingsSheet.Range("C9").Value & ":" & settingsSheet.Range("D9").Value
' Set a reference to the report's sheet
Set reportSheet = ThisWorkbook.Worksheets(reportSheetName)
' Set a reference to the report's columns
Set targetColumnsRange = reportSheet.Range(reportColumnsAddr)
' Set a reference to the report's rows
Set targetRowsRange = reportSheet.Range(reportRowsAddr)
' Find the range of cells to be evaluated
Set targetRange = Intersect(targetColumnsRange, targetRowsRange)
' Loop through each cell and hide if not empty
For Each targetCell In targetRange.Cells
If targetCell.Value <> vbNullString Then
targetCell.EntireColumn.Hidden = True
targetCell.EntireRow.Hidden = True
End If
Next targetCell
End Sub
РЕДАКТИРОВАТЬ:
Если вам нужно только скрыть столбцы. Используйте следующий код:
РЕДАКТИРОВАТЬ 2:
Добавлена строка, чтобы проверить, являются ли входные ячейки пустыми ('Проверьте, пуста ли какая-либо из ячеек и выйдите из подпрограммы).
Public Sub HideColumns()
Dim settingsSheet As Worksheet
Dim reportSheet As Worksheet
Dim targetColumnsRange As Range
Dim reportSheetName As String
Dim reportColumnsAddr As String
' Set a reference to the settings sheet
Set settingsSheet = ThisWorkbook.Worksheets("Sheet1")
' Gather the report sheet's name
reportSheetName = settingsSheet.Range("C7").Value
' Check the : between the two cells reference
reportColumnsAddr = settingsSheet.Range("C8").Value & ":" & settingsSheet.Range("D8").Value
' Check if either cell are empty and exit sub
If settingsSheet.Range("C8").Value = vbNullString Or settingsSheet.Range("D8").Value = vbNullString Then
' Set a reference to the report's sheet
Set reportSheet = ThisWorkbook.Worksheets(reportSheetName)
' Set a reference to the report's columns
Set targetColumnsRange = reportSheet.Range(reportColumnsAddr)
' Hide the columns in range
targetColumnsRange.EntireColumn.Hidden = True
Else
' Do something here
End If
End Sub
Надеюсь, это то, что вы ищете.
Дайте мне знать, если это работает.