vba - 使用 vba 从主工作簿复制的工作表中重命名或添加宏到模块
问题描述
我一直在研究一个文件,我将使用许多不同的功能,并且我使用用户表单作为“控制面板”——我一直试图让一个功能在这里工作,但我真的找不到解决方案。也许这里有人可以提供帮助?我不得不说我对 vba 的经验还很远,但我发现尝试和学习真的很有趣。
我的问题:我有一个代码,可以在其中将形状添加到列表中,还具有单击和缩放功能-我还有将这张表复制到新工作簿中并将其另存为 .xlsm 的代码,并且我在实际表中有宏我复制了-到目前为止一切都很好。
但是我没有设法让宏在新工作簿中工作,因为我在工作表中有宏,新工作簿将宏称为“sheet9.Zoom”,而不是实际上只是将其称为 Zoom - 是否有可能以某种方式在vba代码中重命名复制版本中的宏或确保新工作簿不将其称为“sheet9.Zoom”,以便在单击图片进行缩放时找到宏?这里的一切都是使用表单完成的,因为我想让它对我的同事尽可能地友好:)
这是我用于将缩放功能添加到形状的代码:
Private Sub Commandbutton8_Click()
Set myDocument = Worksheets("Import")
myDocument.Shapes.SelectAll
Set sr = Selection.ShapeRange
Selection.OnAction = "Zoom_Click"
Range("e1").Select
End Sub
Sub Zoom_Click()
Dim shp As shape
Dim big As Single, small As Single
Dim shpDouH As Double, shpDouOriH As Double
big = 0.8
small = 0.11
On Error Resume Next
Set shp = ActiveSheet.Shapes(Application.Caller)
With shp
shpDouH = .Height
.ScaleHeight 1, msoTrue, msoScaleFromTopLeft
shpDouOriH = .Height
If Round(shpDouH / shpDouOriH, 2) = big Then
.ScaleHeight small, msoTrue, msoScaleFromTopLeft
.ScaleWidth small, msoTrue, msoScaleFromTopLeft
.ZOrder msoSendToBack
Else
.ScaleHeight big, msoTrue, msoScaleFromTopLeft
.ScaleWidth big, msoTrue, msoScaleFromTopLeft
.ZOrder msoBringToFront
End If
End With
End Sub
这是用于将工作表复制到新工作簿。
Private Sub CommandButton6_Click()
Dim MyPath As String
Dim MyFileName As String
Dim DateString As String
DateString = Format(Now(), "yyyy-mm-dd_hh_mm_ss_AM/PM")
MyFileName = DateString & "_" & "Pricelist"
If Not Right(MyFileName, 4) = ".xlsm" Then MyFileName = MyFileName & ".xlsm"
Sheets("Import").Copy
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = ""
.AllowMultiSelect = False
.InitialFileName = "C:" '<~~ The start folder path for the file picker.
If .Show <> -1 Then GoTo NextCode
MyPath = .SelectedItems(1) & "\"
End With
NextCode:
With ActiveWorkbook
.SaveAs Filename:=MyPath & MyFileName, FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
.Close False
End With
End Sub
希望这能解释一下:)
解决方案
您可以重新链接复制工作表上的形状宏:
Dim sh As Shape, wbNew As Workbook, ws As Worksheet
ThisWorkbook.Sheets("Import").Copy
Set wbNew = ActiveWorkbook
Set ws = wbNew.Sheets("Import")
For Each sh In ws.Shapes
'relink only if has action set
If Len(sh.OnAction) > 0 Then
sh.OnAction = ws.CodeName & ".Zoom_Click"
End If
Next sh
'save the new workbook...
另请参阅:https ://www.thespreadsheetguru.com/blog/correcting-shape-assigned-macro-links-after-copying-worksheet-vba ,它具有良好的通用方法。
推荐阅读
- python - rdfLib 将单个反斜杠转换为多个反斜杠
- python - 如何将字符串列表保存在变量中?
- python - 变量重新分配期间的 Python 内存管理
- python - 为什么我不能将一个 numpy 数组除以(或乘以)一个标量?
- ios - Firebase 云通知显示 0 打开 0 点击
- python - 在聊天机器人中实现问题建议
- php - 从请求中获取 2 个变量并过滤资源集合
- duplicates - 应用转换后尝试识别重复值时,Power Query 无法识别正确的列名
- python-3.x - 每次调用时加 1 的函数 - Pytho
- javascript - 通过条带结帐会话 node.js 传递元数据