Пользователь может выбрать лист из открытой книги в Excel - PullRequest
0 голосов
/ 25 октября 2018

Я прошу помощи в получении Excel, чтобы спросить пользователя, с какой рабочей книгой выбрать для работы.У меня есть Рабочая книга, в которой есть кнопки, связанные с макросами для выполнения задач, но каждый месяц мне нужно импортировать обновленные данные.Я хотел бы, чтобы две рабочие книги были открыты одновременно, а затем разрешить пользователю запрашивать, какую рабочую книгу следует использовать для импорта обновленных данных.В настоящее время у меня есть код, который позволяет пользователю выбирать, какой лист использовать, но только из документа, из которого запускается макрос.Ежемесячные рабочие книги не имеют стандартного соглашения об именах.

Sub Macro6()
'
' Macro6 Macro
'
' 
Const ColItems  As Long = 20
Const LetterWidth As Long = 20
Const HeightRowz As Long = 18
Const SheetID As String = "__SheetSelection"

Dim i%, TopPos%, iSet%, optCols%, intLetters%, optMaxChars%, optLeft%
Dim wsDlg As DialogSheet, objOpt As OptionButton, optCaption$, objSheet As         
Object
optCaption = "": i = 0

Application.ScreenUpdating = False

On Error Resume Next
Application.DisplayAlerts = False
ActiveWorkbook.DialogSheets(SheetID).Delete
Application.DisplayAlerts = True
Err.Clear

Set wsDlg = ActiveWorkbook.DialogSheets.Add
With wsDlg
.Name = SheetID
.Visible = xlSheetHidden
iSet = 0: optCols = 0: optMaxChars = 0: optLeft = 78: TopPos = 40

For Each objSheet In ActiveWorkbook.Sheets
If objSheet.Visible = xlSheetVisible Then
i = i + 1

If i Mod ColItems = 1 Then
optCols = optCols + 1
TopPos = 40
optLeft = optLeft + (optMaxChars * LetterWidth)
optMaxChars = 0
End If

intLetters = Len(objSheet.Name)
If intLetters > optMaxChars Then optMaxChars = intLetters
iSet = iSet + 1
.OptionButtons.Add optLeft, TopPos, intLetters * LetterWidth, 16.5
.OptionButtons(iSet).Text = objSheet.Name
TopPos = TopPos + 13

End If
Next objSheet

If i > 0 Then

.Buttons.Left = optLeft + (optMaxChars * LetterWidth) + 24

With .DialogFrame
.Height = Application.Max(68, WorksheetFunction.Min(iSet, ColItems) *             
HeightRowz + 10)
.Width = optLeft + (optMaxChars * LetterWidth) + 24
.Caption = "Select sheet to go to"
End With

.Buttons("Button 2").BringToFront
.Buttons("Button 3").BringToFront
Application.ScreenUpdating = True

If .Show = True Then
For Each objOpt In wsDlg.OptionButtons
If objOpt.Value = xlOn Then
optCaption = objOpt.Caption
Exit For
End If
Next objOpt
End If

If optCaption = "" Then
MsgBox "You did not select a worksheet.", 48, "Cannot continue"
Exit Sub
Else


Sheets(optCaption).Activate

End If

End If

Application.DisplayAlerts = False
.Delete
Application.DisplayAlerts = True

End With


End Sub

1 Ответ

0 голосов
/ 25 октября 2018

Если вы хотите книгу, просто используйте Application.Inputbox с типом: = 8 (т.е. выберите диапазон).Это позволит им выбрать любую ячейку в любой рабочей таблице в любой открытой рабочей книге.

Рабочий лист является родительским элементом ячейки, а рабочая книга - родительской в ​​рабочей таблице.

dim rng as range, wb as workbook

set rng  = application.inputbox("select a cell on the workbook you want.", type:=8)

debug.print rng.address(0,0)
debug.print rng.address(0,0, external:=true)
debug.print rng.parent.name
debug.print rng.parent.codename
debug.print rng.parent.parent.name
debug.print rng.parent.parent.fullname

set wb = rng.parent.parent
debug.print wb.name
debug.print wb.worksheets(1).name
...