小编Com*_*ern的帖子

使用GetRawInputData的句柄无效,但仅适用于Esc键按下

我在原始输入窗口过程中有一个奇怪的问题,我无法弄清楚我的生活.

每次Esc按下该键,我的代码在第一次GetRawInputData()调用时都会遇到0x80004005(无效句柄)异常.它似乎只发生在Esc键上:

protected override void WndProc(ref Message message)
{
    switch ((WM)message.Msg)
    {
        case WM.INPUT:
        {
            if (message.LParam == IntPtr.Zero)
            {
                break;
            }
            InputData rawBuffer;
            var dwSize = 0;
            //Invalid handle on this call, only with escape.
            var res = User32.GetRawInputData(message.LParam, DataCommand.RID_INPUT, IntPtr.Zero, ref dwSize, Marshal.SizeOf(typeof(RawInputHeader)));
            if (res != 0)
            {
                var ex = new Win32Exception(Marshal.GetLastWin32Error());
                Logger.Error(ex, "Error sizing the rawinput buffer: {0}", ex.Message);
                break;                           
            }

            res = User32.GetRawInputData(message.LParam, DataCommand.RID_INPUT, out rawBuffer, ref dwSize, Marshal.SizeOf(typeof(RawInputHeader))); …
Run Code Online (Sandbox Code Playgroud)

c# winapi

6
推荐指数
0
解决办法
256
查看次数

VBA:变体数据类型的意外行为

根据MSDN,对于Variant数据类型:

"对于正值,数值数据可以是-1.797693134862315E308到-4.94066E-324之间的任何整数或实数值,对于正值,数值可以是4.94066E-324到1.797693134862315E308."

但是,即使计算后的所有最终值都落在可接受的范围内,以下代码也会出错:

Sub Test()

Dim v1, v2, v3, v4

v1 = 569847501 + 54678                  '  OKAY
v2 = 7784687414# + 98565821345#         '  OKAY
v3 = 7784687414# + 1132747441           '  OKAY
v4 = 1132747441 + 1788441323            '  FAILS

End Sub
Run Code Online (Sandbox Code Playgroud)

MSDN还指出:

"但是,如果对包含Byte,Integer,Long或Single的Variant执行算术运算,并且结果超出原始数据类型的正常范围,则结果将在Variant中提升为下一个更大的数据类型.Byte被提升为Integer,Integer被提升为Long,Long和Single被提升为Double."

文档指出当算术运算超出原始数据类型的正常范围时,应该提升类型.为什么不v4升职Double

vba

6
推荐指数
2
解决办法
120
查看次数

Sub与Function没有返回值

什么是子程序(Sub)的意义?为什么不使用Function没有返回值的?


编辑

我的意思是,为什么关键字Sub存在?我可以使用Function而不声明返回值并具有相同的,不是吗?

vba

6
推荐指数
2
解决办法
3564
查看次数

如果用户正在删除,则检测工作表更改

我想知道如何检测用户是否要删除内容或将内容插入范围。如果他们要删除范围,请说D14:D18。然后,我想执行一个宏,该宏还将删除E14:E18中的内容。如果他们要在D14:D18中输入内容,我只是不想删除E14:E18。

我试过了:

If Selection.ClearContents Then
    MsgBox Target.Offset(0, 3).Style
End If
Run Code Online (Sandbox Code Playgroud)

但是,这让我陷入了无限循环。

更多上下文:

我有数百个单元D:D用于输入服务数量。并非D:D应该触摸所有内容。只有细胞D:D.Style = "UnitInput"。在中,E:E我进行了数据验证,该数据验证仅允许用户输入contractor 1或。contractor 2 但是,当输入内容时,D:D我运行宏以将默认承包商(位于中F:F)分配给E:E。因此,当用户在其中输入数量时,D:D可以正确分配默认承包商。当他们从中删除单个项目时,D:D我会处理承包商的适当撤离。仅当他们从中删除一系列项目时D:D

完整代码:

 Private Sub Worksheet_Change(ByVal Target As Range)
    Application.ScreenUpdating = False
    On Error GoTo ErrHandler:
    If Selection.Rows.Count * Selection.Columns.Count = 1 Then
        If Target.Offset(0, 3).Style = "Contractor" Then
            If Target.Value < 1 Then
                Target.Offset(0, 3).Value = ""
            Else …
Run Code Online (Sandbox Code Playgroud)

excel vba excel-vba

5
推荐指数
1
解决办法
3163
查看次数

CLng() 和 CDbl() 正在删除小数

如果我CLng("22.14")在我的 PC 的 Excel VBA 编辑器中运行,我会得到预期的结果,22. 如果我在一些国际同事的 PC上执行此操作,则会产生2214.

CDbl正在做类似的事情。我得到22.14,他们得到2214

我的想法:我假设一些设置定义了十进制字符(我的正确是“.”,而他们的则是别的)。我的搜索没有产生任何其他想法或解决方案。

excel vba type-conversion internationalization

4
推荐指数
1
解决办法
1034
查看次数

打开工作簿时运行宏

我已经搜索了。最相关的建议是宏名称“ workbook_open”,但是我仍然必须手动调用该模块。这是我编写的代码。(欢迎提出任何其他建议,因为这是我的第一个vba脚本-73岁)

Sub Workbook_Open()  
  Dim lastRow As Long     'last row with data  
  Dim thisDate As Double  'start timestamp  
  thisDate = Now()  
  With Sheets("Pressure Log")  
    lastRow = .Range("B" & .Rows.Count).End(xlUp).Row 'populate next row with date/time  
    Range("B" & lastRow).Offset(1) = Format(thisDate, "dddd")  
    Range("B" & lastRow).Offset(1, 1) = Format(thisDate, "mm/dd/yyyy")  
    Range("B" & lastRow).Offset(1, 2) = Format(thisDate, "hh:mm AM/PM")  
    Range("B" & lastRow).Offset(1, 3).Select 'position for user data  
  End With  
End Sub  
Run Code Online (Sandbox Code Playgroud)

excel vba

2
推荐指数
1
解决办法
714
查看次数

VBA - 如何在数组中创建队列?(FIFO)先进先出

我正在尝试建立一个能够显示先出先出概念的队列.我想要一个作为等待名单的数组.后来的病人将在晚些时候出院.在这个房间里有24名病人的限制,其余的将进入等待名单.每当房间空无一人时,等候室(最早)的第一批病人就会前往房间.这是我到目前为止提出的代码.任何帮助是极大的赞赏.

    Dim arrayU() As Variant
    Dim arrayX() As Variant
    Dim arrayW() As Variant
    Dim LrowU As Integer
    Dim LrowX As Integer
    Dim LrowW As Integer
    'Dim i As Integer
    Dim j As Integer
    Dim bed_in_use As Integer

    LrowU = Columns(21).Find(What:="*", LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    LrowX = Columns(24).Find(What:="*", LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    LrowW = Columns(23).Find(What:="*", LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

    ReDim arrayU(1 To LrowU)
    ReDim arrayX(1 To LrowX)
    ReDim arrayW(1 To LrowW)

    For i = 3 To LrowU
        arrayU(i) = Cells(i, 21)
    Next i

    i …
Run Code Online (Sandbox Code Playgroud)

queue vba fifo

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

退出循环太快vba

我是编程的新手,目前正致力于学习vba.我遇到了一个问题,我试图运行的每个循环,我太快退出循环.我有一个范围,我想测试它是否存在某些值,如果是,我想删除该列.但它只测试一次条件然后退出循环.非常感谢任何帮助!

  For Each cell In ActiveSheet.Range("S1:AA1")


    If ActiveCell.Value = "Actual" Then
        ActiveCell.EntireColumn.Delete


    ElseIf ActiveCell.Value = "" Then
        ActiveCell.EntireColumn.Delete


    Else: ActiveCell.Offset(, 1).Select


    End If

Exit For

Next
Run Code Online (Sandbox Code Playgroud)

excel vba excel-vba

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

ByRef参数类型不匹配整数

我正在尝试这段代码,无法摆脱错误"ByRef参数类型不匹配".

我已经将i和j声明为整数,并且我已经将ByRef放在DisplayTreeHelp函数中,以便在我完成执行DisplayTreeHelp函数后保留i和j的值.(否则该值将返回到输入DisplayTreeHelp之前的值).但是,如果我没有在DisplayTreeHelp函数中指定ByRef,则保持该值.

Public Sub DisplayTree()
    'Given country
    Dim country As String
    country = Sheets("Tree").Range("Country").Value2

    'Start cell
    Dim start As Range
    Set start = Range("A2")

    Dim dic1 As Dictionary
    Dim key1 As Variant
    Dim i, i_max As Integer
    Dim j, j_max As Integer

    Set dic1 = CreateTree
    'Column start
    j = start.Column
    j_max = j
    'Row start
    i = start.Row
    i_max = i

    Dim tempArrSize As Long
    tempArrSize = 1

    Dim tempArr1() As Variant
    ReDim tempArr1(1 To 1)

    'Iterate dictionary to …
Run Code Online (Sandbox Code Playgroud)

excel vba

1
推荐指数
2
解决办法
129
查看次数