Excel VBA:如何捕获MsgBox响应

时间:2017-09-15 03:26:52

标签: excel vba excel-vba

我想执行以下任务:

  • 写下信息"你醒了吗?"并显示问号

  • 捕获整数变量intR中的响应,将intR值放在单元格A2中

  • 如果回答为是,则写入单元格A1" Hurray"

  • 如果回答为“否”,则写一个带有文本" ZZZZZZZZ"

  • 的消息框
  • 如果响应为“取消”,则退出子

    Sub EX3_1_6MsgBoxFunction()
    
    Dim intR As Integer
    Dim TxtRng As Range
    Dim stra As String
    Dim stra2 As String
    
    'Have the message box display the buttons Yes, No and Cancel
    
    
    intR = MsgBox("Are you awake ? ", vbQuestion + vbYesNoCancel)
    intR = Range("a2")
    
    If intR = vbYes Then
    Range("a1") = "Hurray"
    
    'that means yes
    
    ElseIf intR = vbNo Then
    stra2 = MsgBox("ZZZZZZZZZZ")
    
    Else
    
    Range("a2") = intR
    
    
    End If
    
    End Sub
    

3 个答案:

答案 0 :(得分:2)

首先欢迎来到StackOverflow。当您提出问题时,请记住在代码中指明问题所在。

  
      
  • 写下“你醒了吗?”并显示问号
  •   

如果我理解正确,你只是想要显示一个问号,但可以选择3种可能性,由以下MsgBox模式给出:

    intR = MsgBox "Are you awake ?", vbYesNoCancel

这会显示MsgBox需要回答(因此我删除了问题中的最后一个要点,因为答案是“是”还是“否”或“取消“;它不能是其他任何内容。The answer code is then mapped on an integer intR,这是正确的。

  
      
  • 捕获整数变量intR中的响应,将intR值放在单元格A2中
  •   

正如YowE3K指出的那样,它应该是Range("a2").Value = intR,而不是intR = Range("a2")

  
      
  • 如果回答为是,则写入单元格A1“Hurray”
  •   
  • 如果回答为否,则写一个带有文字“ZZZZZZZZ”的消息框
  •   
  • 如果响应为“取消”,则退出子
  •   

您可以在此处使用Select Case:将其视为具有两种以上可能性的If

Select Case intR
    Case 6 '<- According to the link I provided vbYes = 6
        Range("a1") = "Hurray"
    Case 7 '<- According to the link I provided vbNo = 7
        MsgBox "ZZZZZZZZ"
    Case 2 '<- According to the link I provided vbCancel = 2
        Exit Sub
End Select

您可以编写vbYes,vbNo和vbCancel而不是整数。正如另一个用户所指出的那样,代码可能更具可读性。

答案 1 :(得分:1)

你可以尝试这样的事情......

{{1}}

答案 2 :(得分:0)

除了Noldor的答案之外,作为一般规则,你不应该使用匈牙利表示法来表示变量名, int number_dim = stream_in[0].dim; int number_test = stream_in[0].num; // 4072 int number_classes = _n_classes; tensorflow::Tensor input_tensor(tensorflow::DT_FLOAT, tensorflow::TensorShape({number_test, number_dim})); auto dst = input_tensor.flat<float>().data(); for (int i = 0; i < stream_in[0].num; i++) { std::copy_n(dataptr + i * number_dim, number_dim, dst); dst += number_dim; } std::vector<std::pair<std::string, tensorflow::Tensor>> inputs = {{tokens_io[0], input_tensor}}; std::vector<tensorflow::Tensor> outputs; status = session->Run(inputs, {tokens_io[1]}, {}, &outputs); if (!status.ok()) { ssi_wrn("status: %s \n", status.ToString().c_str()); return; } std::vector<int> number_hits(number_classes, 0); for (std::vector<tensorflow::Tensor>::iterator it = outputs.begin(); it != outputs.end(); ++it) { auto items = it->shaped<float, 2>({number_test, number_classes}); for (int i = 0; i < number_test; i++) { int arg_max = 0; float val_max = items(i, 0); for (int j = 0; j < number_classes; j++) { if (items(i, j) > val_max) { arg_max = j; val_max = items(i, j); } } for (int i = 0; i < number_classes; i++) { if (arg_max == i) { number_hits[i]++; } } } } for (int i = 0; i < _n_classes; i++) { float accuracy = (float) number_hits[i] / number_test; ssi_wrn("accuracy for class %s : %f \n", _class_names[i], accuracy); _probs[i] = accuracy; } session->Close(); 并没有真正告诉你变量与它的类型有何不同。

您应该能够从上下文推断出类型,变量名称应该为您提供更有用的东西。我建议重写你的代码,如

intR

请注意,您不需要将MsgBox分配给变量,您只需使用参数(在本例中为Sub EX3_1_6MsgBoxFunction() Dim retVal As Integer 'Ask the user whether they're awake retVal = MsgBox("Are you awake ? ", vbQuestion + vbYesNoCancel) 'Switch on their answer Select Case retVal Case vbYes Range("A2") = "Hurray" Case vbNo MsgBox "ZZZZZZZ" End Select End Sub )调用它来提示用户,这样就可以消除您不必要的{{1 }和"ZZZZZ"。您也不需要明确stra2,因为代码会在straExit Sub语句后自然退出。