我找到了一种直接从VBA宏调用.NET 2代码的方法:
Dim clr As mscoree.CorRuntimeHost
Set clr = New mscoree.CorRuntimeHost
clr.Start
Dim domain As mscorlib.AppDomain
clr.GetDefaultDomain domain
Dim myInstanceOfDotNetClass As Object
Set myInstanceOfDotNetClass = domain.CreateInstanceFrom("SomeDotNetAssembly.dll", "Namespace.Typename").Unwrap
Call myInstanceOfDotNetClass.ExecuteSomeDotNetMethod
Run Code Online (Sandbox Code Playgroud)
(为了使这段代码工作,我想在Excel中使用工具 - >引用...将对mscoree.tlb和mscorlib.tlb的引用添加到Excel VBA)
但这仅适用于.NET CLR 2程序集,最高可达.NET Framework 3.5版.
现在我需要使用.NET 4.
我已经了解.NET CLR4引入了另一种与版本无关的创建运行时实例的方法,我还发现了一个用C++编写的相当简单的代码示例:http: //dev.widemeadows.de/2014/02/ 04 /托管最净-4-运行时在-一个天然过程/
但是我的Excel VBA技能还不足以将这几行代码转换为工作的VBA makro.有人能帮帮我吗?
标准VBA编辑器中是否有工具,方法或设置来警告已经Dim'med,但没有被使用的变量?
好吧不是真的RANDBETWEEN().我正在尝试创建一个UDF来返回数组中数字的索引,其中数字越大,选择的可能性就越大.
我知道如何将概率分配给工作表中的随机数(即使用MATCH()概率的总和,SO上有很多东西来解释),但我想要一个UDF,因为我将一个特殊的输入数组传递给函数 -不仅仅是一个选定的范围.
我的问题是,加权是关闭的,数组中的数字后面的数字比数组中的数字更有可能被返回,我无法看到我的代码中哪里出错了.到目前为止这是UDF:
Public Function PROBABLE(ParamArray inputArray() As Variant) As Long
'Takes a set of relative or absolute probabilities and ranks a random number within them
Application.Volatile (True)
Dim outputArray() As Variant
Dim scalar As Single
Dim rankNum As Single
Dim runningTot As Single
'''''
'Here I take inputArray() and convert to outputArray(),
'which is fed into the probability code below
'''''
scalar = 1 / WorksheetFunction.Sum(outputArray)
rankNum = Rnd()
runningTot = 0
For i …Run Code Online (Sandbox Code Playgroud) API声明:
Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" ( _
ByVal lpPrevWndFunc As Long, _
ByVal HWnd As Long, _
ByVal msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Run Code Online (Sandbox Code Playgroud)
为lpPrevWndFunc参数提供不存在的函数指针时,Excel将崩溃。
同样,
Private Declare Sub RtlMoveMemory Lib "kernel32" (ByRef Destination As LongPtr, _
ByRef Source As LongPtr, _
ByVal Length As Long)
Run Code Online (Sandbox Code Playgroud)
当Destination或Source不存在时不高兴。
我认为这些错误是内存访问冲突。我假设Windows告诉调用者它正在做某件事,而它做不到1-也许它向Excel发送了一条消息,并且没有处理程序?MSDN对此有以下说法:
调用Windows动态链接库(DLL)或Macintosh代码资源期间的系统错误不会引发异常,也无法使用Visual Basic错误捕获来捕获。调用DLL函数时,应检查每个返回值是否成功(根据API规范),如果失败,请检查Err对象的LastDLLError属性中的值。在Macintosh上,LastDLLError始终返回零。 (强调我自己)
但是在这些情况下,我没有任何值可以检查错误,只是崩溃了。
1:如果它捕获的错误不是经常发生的,例如说内存重写有效但未定义,则错误可能会一直存在。但是可以肯定的是,在执行限制之前,应该捕获对受限内存的写入或调用伪指针吗?
导致此崩溃的原因是什么(这是 …
我已经在VBA中编写了一些代码来子类化用户表单,以便最终我可以截获WM_TIMER发送给它的消息。我这样做不是指定TIMERPROC,因为它允许我使用VBA自己的错误处理和调用方法来运行回调函数。我使用的是用户表单,而不是Application.hWnd因为:
Application.hWnd,无法以慢速解释的语言(如VBA)对其进行子类化End语句)时,用户窗体将自行消失-断开所有仍在发送消息的计时器。
SetTimer继续触发我的消息窗口一切正常,除了我发现偶而在我的代码启动并运行时,按下复位/停止按钮,一切都崩溃了。
我希望我的窗口可以取消分类并安全地销毁。
我创建了以下内容,以允许我将用户窗体作为子类(尚无计时器,问题仅通过子类化即可显现出来):
WinAPI我使用了新的子类风格,因为MSDN告诉我这样做,以防万一我需要添加更多子类-但这不会有所作为。
Option Explicit
Public Enum WindowsMessage 'As Long - for intellisense
WM_TIMER = &H113 'only care about this one
'...
End Enum
Public Declare Function DefSubclassProc Lib "comctl32.dll" Alias "#413" ( _
ByVal hWnd As LongPtr, _
ByVal uMsg As WindowsMessage, _
ByVal wParam As LongPtr, _
ByVal lParam As LongPtr) As LongPtr
Public …Run Code Online (Sandbox Code Playgroud) 在VBA中,Evaluate()和[]方法都可以用于返回数组:
Dim i As Variant
i = Evaluate("{1,2;3,4}")
i = [{1,2;3,4}]
Run Code Online (Sandbox Code Playgroud)
两行都设置i为包含数字1-4的2D数组.增加的功能是Evaluate(...)(1,2)返回数组的R1C2索引元素(即2 - [...](1,2)同时出错)
我想知道是否有任何语法以相同的方式评估数组返回工作表函数,例如
i = Evaluate("LEN(A1:A5)>3") 'or similar like [{LEN(A1:A5)>3}]
Run Code Online (Sandbox Code Playgroud)
应该返回1D数组,{False,False,False,True,True}如果我在A4&中有超过3个字符的文本A5,但它没有.
如果没有,是否还有另一种评估数组公式的单线方式来返回完整的数组?我正在寻找任何方法给出最小的字符数.
与Can I conda install an alpha or beta version of Python密切相关?但这个问题是关于 conda-forge 中的特定版本。如果 Python 版本(例如 3.10.0b1)可以通过https://www.python.org/download/pre-releases/下载但还没有在主要的 anaconda 或任何其他 conda 频道中,那么我最好的选择是什么?使用它?
特别是对于 Python 的 alpha/beta 版本,我希望为我的安装保护 conda 环境。我现在担心使用标准 Python 安装程序,因为它可能无法正常运行,但也许我可以采取一些缓解措施?
我在 typeshed 中看到过这样的行:
但os.PathLike似乎并不通用。它不允许传递字符串。
import os
import pathlib
def test(f: os.PathLike[str]):
print(pathlib.Path(f))
test(r"C:\Program Files")
Run Code Online (Sandbox Code Playgroud)
上面的代码片段失败了 Mypy。
我有一个用 TamperMonkey 编写的非常简单的用户脚本,我希望它在 chrome 新标签页上运行。
根据此站点,无法在新标签页上运行用户脚本:
新标签页的 URL 是“chrome://newtab/”,Chrome 不允许扩展程序将脚本注入该页面。
但是如果我在标题部分指定,我的脚本运行良好
// @match *://*/*
Run Code Online (Sandbox Code Playgroud)
匹配所有页面。不过,我宁愿代码只在新标签页上运行,这可能吗?
注意。这是完整的脚本:Chrome 版本 59.0.3071.115
// ==UserScript==
// @name Hide Buttons
// @namespace http://tampermonkey.net/
// @version 0.1
// @description Test script
// @author Greedo
// @match *://*/*
// @grant none
// ==/UserScript==
(function(window, chrome) {
"use strict";
var doc = window.document;
doc.getElementById("mv-tiles").style.opacity = "0";
doc.getElementById("f").style.opacity = "0.1";
}(window, chrome));
Run Code Online (Sandbox Code Playgroud) 我有一个插件和一个工作簿打开.插件是.xlam文件,在工作簿中我添加了对它的引用.插件受密码保护.
可以从我的工作簿中运行addin的公共方法.然而,在一个插件的方法使用的VBA.UserForms.Add打开是在运行时创建的窗体像这样
让我们说一个引用的工作簿myAddin有这个:
Private Sub callAddin()
myAddin.ShowForm ThisWorkbook
End Sub
Run Code Online (Sandbox Code Playgroud)
通常,我的插件中的代码如下所示:
Public Sub ShowForm(CallerWorkbook As Workbook)
Const vbext_ct_MSForm As Long = 3
'This is to stop screen flashing while creating form
Application.VBE.MainWindow.Visible = False
'Add to ThisWorkbook, not supplied workbook or VBE will crash - ignore CallerWorkbook
Dim myForm As Object
Set myForm = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm)
'Create the User Form
With myForm
.Properties("Caption") = "Select"
.Properties("Width") = 300
.Properties("Height") = 270
End With
'Show the form …Run Code Online (Sandbox Code Playgroud)