小编Gre*_*edo的帖子

Canonical:如何从Excel VBA调用.NET方法

我找到了一种直接从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.有人能帮帮我吗?

.net c# clr vba runtime

22
推荐指数
4
解决办法
2万
查看次数

VBA中是否有办法了解未使用的变量?

标准VBA编辑器中是否有工具,方法或设置来警告已经Dim'med,但没有被使用的变量?

variables excel vba excel-vba vbe

14
推荐指数
2
解决办法
6827
查看次数

Excel UDF加权RANDBETWEEN()

好吧不是真的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)

excel vba excel-vba user-defined-functions

12
推荐指数
1
解决办法
279
查看次数

如何处理VBA中的DLL错误?

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)

DestinationSource不存在时不高兴。

我认为这些错误是内存访问冲突。我假设Windows告诉调用者它正在做某件事,而它做不到1-也许它向Excel发送了一条消息,并且没有处理程序?MSDN对此有以下说法:

调用Windows动态链接库(DLL)或Macintosh代码资源期间的系统错误不会引发异常,也无法使用Visual Basic错误捕获来捕获。调用DLL函数时,应检查每个返回值是否成功(根据API规范),如果失败,请检查Err对象的LastDLLError属性中的值。在Macintosh上,LastDLLError始终返回零。 (强调我自己)

但是在这些情况下,我没有任何值可以检查错误,只是崩溃了。

1:如果它捕获的错误不是经常发生的,例如说内存重写有效但未定义,则错误可能会一直存在。但是可以肯定的是,在执行限制之前,应该捕获对受限内存的写入或调用伪指针吗?

我最感兴趣的是:

  1. 导致此崩溃的原因是什么(这是 …

error-handling excel winapi vba memory-access

12
推荐指数
1
解决办法
332
查看次数

为什么在子类化的过程中我不能`End`代码而不破坏所有内容?

我已经在VBA中编写了一些代码来子类化用户表单,以便最终我可以截获WM_TIMER发送给它的消息。我这样做不是指定TIMERPROC,因为它允许我使用VBA自己的错误处理和调用方法来运行回调函数。我使用的是用户表单,而不是Application.hWnd因为:

  1. 我不必过滤我的vs Excel /主机应用程序的消息
  2. 太多的消息正在传递Application.hWnd,无法以慢速解释的语言(如VBA)对其进行子类化
  3. 当代码执行中断(按“停止”按钮或遇到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)

excel winapi vba subclass userform

9
推荐指数
0
解决办法
444
查看次数

如何使用Evaluate方法计算数组公式

在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,但它没有.

如果没有,是否还有另一种评估数组公式的单线方式来返回完整的数组?我正在寻找任何方法给出最小的字符数.

arrays excel vba excel-vba excel-formula

8
推荐指数
1
解决办法
572
查看次数

在 Windows 上使用 conda 或与 conda 一起安装 Python alpha 和 beta 版本时,我有哪些选择?

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 频道中,那么我最好的选择是什么?使用它?

  • 在 conda-forge 上打开一个问题
  • 一些通用的 conda 安装脚本来在环境中运行 python 安装程序?
  • 还有什么...

特别是对于 Python 的 alpha/beta 版本,我希望为我的安装保护 conda 环境。我现在担心使用标准 Python 安装程序,因为它可能无法正常运行,但也许我可以采取一些缓解措施?

python windows conda virtual-environment

8
推荐指数
1
解决办法
405
查看次数

os.PathLike[Any] 与 os.PathLike[str]

我在 typeshed 中看到过这样的行:

https://github.com/python/typeshed/blob/994b69ef8f18e76689daca3947879c3d7f76173e/stdlib/_typeshed/__init__.pyi#L77

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

python type-hinting mypy python-typing python-3.9

8
推荐指数
1
解决办法
5567
查看次数

在 Chrome 新标签页上运行的 JS 用户脚本

我有一个用 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)

javascript google-chrome tampermonkey

7
推荐指数
1
解决办法
2174
查看次数

在运行时将userform添加到其他工作簿

我有一个插件和一个工作簿打开.插件是.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)

excel vba excel-vba vbe

7
推荐指数
1
解决办法
111
查看次数