我在原始输入窗口过程中有一个奇怪的问题,我无法弄清楚我的生活.
每次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) 根据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?
什么是子程序(Sub)的意义?为什么不使用Function没有返回值的?
编辑
我的意思是,为什么关键字Sub存在?我可以使用Function而不声明返回值并具有相同的,不是吗?
我想知道如何检测用户是否要删除内容或将内容插入范围。如果他们要删除范围,请说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) 如果我CLng("22.14")在我的 PC 的 Excel VBA 编辑器中运行,我会得到预期的结果,22. 如果我在一些国际同事的 PC上执行此操作,则会产生2214.
CDbl正在做类似的事情。我得到22.14,他们得到2214。
我的想法:我假设一些设置定义了十进制字符(我的正确是“.”,而他们的则是别的)。我的搜索没有产生任何其他想法或解决方案。
我已经搜索了。最相关的建议是宏名称“ 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) 我正在尝试建立一个能够显示先出先出概念的队列.我想要一个作为等待名单的数组.后来的病人将在晚些时候出院.在这个房间里有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) 我是编程的新手,目前正致力于学习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) 我正在尝试这段代码,无法摆脱错误"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)