Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 使用多个工作簿从超链接调用宏,无需重新打开宏工作表_Vba_Excel_Hyperlink - Fatal编程技术网

Vba 使用多个工作簿从超链接调用宏,无需重新打开宏工作表

Vba 使用多个工作簿从超链接调用宏,无需重新打开宏工作表,vba,excel,hyperlink,Vba,Excel,Hyperlink,我有两本工作手册: 带宏的工作簿 要写入的工作簿 我有两个潜艇。一个是在“要写入的工作簿”中插入超链接,另一个子项将在单击超链接时执行 然而,我创建超链接的sub给我带来了一些混乱。我需要引用启用宏的工作簿中的工作表,但这样做需要使用工作簿.Open命令。显然,启用宏的工作簿将已打开,因此将关闭并重新打开它。我被弄糊涂了,有人能给我指出正确的方向吗 因此,宏工作表将有以下子项,链接到同一工作表中的另一个子项。“CreateHyperlinks”是从另一个写入外部电子表格的方法调用的 显然,下面的

我有两本工作手册:

带宏的工作簿

要写入的工作簿

我有两个潜艇。一个是在“要写入的工作簿”中插入超链接,另一个子项将在单击超链接时执行

然而,我创建超链接的sub给我带来了一些混乱。我需要引用启用宏的工作簿中的工作表,但这样做需要使用工作簿.Open命令。显然,启用宏的工作簿将已打开,因此将关闭并重新打开它。我被弄糊涂了,有人能给我指出正确的方向吗

因此,宏工作表将有以下子项,链接到同一工作表中的另一个子项。“CreateHyperlinks”是从另一个写入外部电子表格的方法调用的

显然,下面的“活动表”是错误的。我想写一个不同的电子表格,所以我还需要打开它(我想是吧)

或者,我是否可以通过调用“CreateHyperlinks”的write方法传递正在写入的工作表,或者我是否将所有内容耦合得过多

' This is called elsewhere
Sub CreateHpyerlinks(rangeValue, textValue)
    Dim fileName As String
    Dim wb As Workbook
    Dim TheSheet As Worksheet
        
    
    fileName = "c:\blah\blah.xlsm"
    
    ' ** This is the part: How do i reference "TheSheet" without opening the XL?
    Set wb = Workbooks.Open(fileName:=fileName)
    Set TheSheet = wb.Sheets("MasterCard")
    TheSheet.UsedRange.Select       
   
   ActiveSheet.Hyperlinks.Add Anchor:=rangeValue, Address:=TheSheet!THISISMYMACROHERE(textValue), SubAddress:="", ScreenTip:="Go to Word Documebnt", TextToDisplay:=textValue
    
End Sub

更新:

我已更新Sub,并且正在命中的
对象不支持其方法或属性

Sub CreateHpyerlinks(rangeValue, textValue)
    Dim fileName As String
    Dim wb As Workbook
    Dim wbWrite As Workbook
    Dim TheSheetWithMacros As Worksheet
    Dim TheSheetToWriteTo As Worksheet
    
    fileName = "c:\WorkbookToWriteTo.xlsx"
    
    Set wb = Application.Workbooks(ThisWorkbook.Name)
    Set TheSheetWithMacros = wb.Worksheets("Sheet1")

    Set wbWrite = Workbooks.Open(fileName:=fileName)
    Set TheSheetToWriteTo = wbWrite.Worksheets("Sheet1")
    
    ' This Line Errors:
    TheSheetToWriteTo.Hyperlinks.Add Anchor:=rangeValue, Address:="", SubAddress:=TheSheetWithMacros!Goto80BytePopulationGuide(textValue), ScreenTip:="Call Macro", TextToDisplay:=textValue
        
    wbWrite.Save
    wbWrite.Close
    
End Sub

thesheetwriteto.Hyperlinks.Add锚点:=范围值,地址:=“”,子地址:=TheSheetWithMacros!转到80bytepopulationguide(textValue),屏幕提示:=“调用宏”,TextToDisplay:=textValue
出现故障,显然是表格出错了!CallMacro无法像我希望的那样工作。

您可以将模块代码从一个工作簿复制到另一个工作簿。现在,我假设工作表模块仅包含宏而不包含其他内容(或者可以复制该模块中的所有内容)

所以我提出这个建议的原因是,如果你可以复制它,那么你可以将超链接指向一个本地(在同一个文件中)宏——因为我们正在将模块复制到新文件中——我想你已经能够做到了

这要求您检查信任中心设置以允许访问VBProject。提示将要求您在继续之前执行此操作

Sub writeit()
'copies a specified code module from one workbook, to
' a code module in another workbook
'
'ASSUMPTIONS:
'-the specified destination must already exist
'-the specified destination does not already contain
' any procedures that would conflict naming with the
' copied module procedures
MsgBox "Please make sure to enable access to ""Trust access to the VBA Project Object Model""", vbInformation
Application.CommandBars.ExecuteMso("MacroSecurity")


Dim macrobook As Workbook
Dim otherbook As Workbook

Dim lines As String
Dim destModule As Object 'VBComponent
Dim copyModule As Object 'VBComponent


Set macrobook = ThisWorkbook  'Modify as needed
Set copyModule = macrobook.VBProject.VBComponents("Sheet1")  'Name of your module to copy

Set otherbook = Workbooks(2)  'Modify as needed
Set destModule = otherbook.VBProject.VBComponents("Sheet1")      'name of where it will go

'Appends the lines from CopyModule to DestModule
With destModule.CodeModule
     .InsertLines .CountOfLines + 1, copyModule.CodeModule.lines(1, copyModule.CodeModule.CountOfLines)
End With


End Sub

开始的好地方,@chrisneilsen谢谢,我现在已经这样做了,在其他地方(某种程度上)这是必要的,但我现在已经删除了,这总体上是不好的!我认为问题出在
子地址
参数中。SheetWithMacros在另一个工作簿中,因此您需要限定它,例如
子地址:=[workbook\u name.xlsm]SheetName!宏名称(args)
为什么这需要是一个超链接?您是否可以使用工作表的
选择\u Change
过程,在选择单元格时自动运行宏?顺便说一句,“外接程序被阻止”?你为什么样的组织工作??SMH人。。。外接程序将VBA所有最强大的功能公开给您的项目。嗯。。。我从来都不明白公司的政策限制你在工作中使用最好的工具。。。即使稍微放宽限制,并要求数字签名加载项,或一些批准流程等。非常感谢。我得花点时间来处理这个。该模块有2500多行代码!我要把整件该死的东西都改造一下。如果这不起作用,什么都不会!非常感谢。我将不得不修改上述内容,但是的,它已经在工作(当然不是完全)非常感谢,标记为接受,因为我可以从这里开始工作!明亮的没问题!如果您知道需要复制的特定行,也可以这样做,这样可以避免在不需要其他行的情况下复制整个2500多行代码。例如,您只需执行:
.InsertLines.CountOfLines+1,copyModule.CodeModule.lines(105,139)
这只会添加105和139之间的行,等等。再次感谢您,这对于正在处理的其他事情来说确实非常有用!)这里看起来不错,而且权力机构很乐意允许在这方面多做几天的工作!