我有一个类,它对excel文件执行许多类似但不同的读/写操作.所有这些操作都在单独的功能中定义.它们都必须包含在相同的长代码块中(检查和打开文件,保存,关闭等的代码).什么是不必每次都复制此代码的合理方法?问题是,在执行每个方法不同的代码之前,我不能只包含一个包含所有共享代码的方法,因为该代码必须包含在共享代码的if,try和for语句的多个层中.
是否可以将函数作为参数传递,然后在共享代码中运行该函数?或者有更好的方法来处理这个问题吗?
如何在不使用"另存为文件"对话框的情况下通过打印到虚拟打印机来保存xps文件?当我调用print方法时,会弹出一个对话框,要求用户指定文件名和路径.这仅适用于创建全新文件; 如果我试图覆盖现有文件,它会抛出一个错误'你没有权限写入该文件......' 无论如何,我希望用户能够在我自己的对话框中指定文件名,而不是printDocument的Print方法自动调用的文件名.
Public Event PrintPage As System.Drawing.Printing.PrintPageEventHandler
Private WithEvents Doc As New Printing.PrintDocument
Public Sub SaveXPSFile()
Doc.PrinterSettings.PrinterName = "Microsoft XPS Document Writer"
Doc.PrinterSettings.PrintFileName = "C:\Users\POConnell\Documents\t.xps"
Doc.Print()
Doc.Dispose()
End Sub
Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles Doc.PrintPage
'drawing commands go here
End sub
Run Code Online (Sandbox Code Playgroud) 如何获取每个监视器的句柄?我需要知道哪个监视器句柄对应于每个物理监视器。如果我还有每个显示器的位置和编号,我就可以找到它。但我什至无法拿到显示器的手柄。
我已经阅读了 EnumDisplayMonitors 的文档数十次,但我尝试过的任何方法都不起作用。
我尝试这样做:
oEnumDisplayMonitors := RegisterCallback("EnumMonitorsProc")
DllCall("EnumDisplayMonitors", "Ptr", 0, "Ptr", 0, "Ptr", oEnumDisplayMonitors, "Ptr", 0)
omh := oEnumDisplayMonitors.monitorHandle
h := oEnumDisplayMonitors.hdc
olpr := oEnumDisplayMonitors.lpRect
EnumMonitorsProc(monitorHandle, hdc, lpRect, lParam){
}
Run Code Online (Sandbox Code Playgroud)
但是 EnumMonitorsProc 的每个参数的值都是 null。
我还按照这篇文章中的示例尝试了以下操作:https://www.autohotkey.com/boards/viewtopic.php?f=6&t=4606 但是,脚本一旦发出 DllCall("枚举显示监视器”,...
Monitors := MDMF_Enum("")
For HMON, M In Monitors {
l := M.Left
t := M.Top
h := HMON
}
MDMF_Enum(HMON := "") {
Static EnumProc := RegisterCallback("MDMF_EnumProc")
Static Monitors := {}
If (HMON = "") ; new enumeration
Monitors := {} …Run Code Online (Sandbox Code Playgroud) 当我运行 32 位版本的 Excel 时,我使用的代码运行良好。当我切换到 64 位版本后,宏就崩溃了。我更新了 dll 调用以在LongPtr各处使用而不是Long.
对于特定的 VBA7,有什么方法可以确定哪些参数和返回类型需要更改,哪些不需要更改Declare Function?
这是我更新的一些“声明函数”的示例(实际上还有更多)。
#If VBA7 Then
Private Declare PtrSafe Function CreateDC Lib "gdi32.dll" Alias "CreateDCA" (ByVal lpDriverName As String, ByVal lpDeviceName As String, ByVal lpOutput As String, lpInitData As LongPtr) As LongPtr
Private Declare PtrSafe Function CreateCompatibleBitmap Lib "gdi32.dll" (ByVal hdc As LongPtr, ByVal nWidth As LongPtr, ByVal nHeight As LongPtr) As LongPtr
Private Declare PtrSafe Function DeleteDC Lib "gdi32.dll" (ByVal hdc As LongPtr) …Run Code Online (Sandbox Code Playgroud)