【问题标题】:Compare string to text from clipboard将字符串与剪贴板中的文本进行比较
【发布时间】:2023-03-03 15:42:01
【问题描述】:

我正在尝试交叉检查列是否按要求的顺序可用。

在剪贴板中,变量与“用户名”完全相同。

但是msgbox没有弹出消息。

Sub macro1()
    Dim Mystring As String
    Dim DataObj As New MSForms.DataObject
    Range("A1").Select
    Selection.Copy
    DataObj.GetFromClipboard
    Mystring = DataObj.GetText
    If Mystring = "User Name" Then
        MsgBox "Correct column"
    End If
End Sub

我的要求是:
检查 Excel 文件报告并按特定顺序排列数据。

例如:
如果列按 A、B、C、D、E、F、G 顺序排列,我想将顺序更改为 C、A、B、G、E、F、D 以及以下数据。

【问题讨论】:

  • 我想知道您为什么尝试使用DataObject 来完成如此简单的任务吗?你想玩这个对象吗?否则,使用剪贴板只会消耗 Excel 资源并使代码变慢,而不会带来任何好处。

标签: excel vba if-statement


【解决方案1】:

数据对象正在向字符串末尾添加其他字符。

打开您的即时窗口(IDE 窗口上的 ctrl + g),您可以在此处进行测试:

Sub macro1()
 
Dim Mystring As String
Dim DataObj As New MSForms.DataObject
    Range("A1").Select
    Selection.Copy
    DataObj.GetFromClipboard
    Mystring = DataObj.GetText
        If Trim(Mystring) = "User Name" Then
            MsgBox "Correct column"
        End If
    
    
    'Comparing strings
    Dim i As Long
    Debug.Print Len(Mystring), Len("User Name")
    For i = 1 To Len(Mystring)
        Debug.Print Mid(Mystring, i, 1), Asc(Mid(Mystring, i, 1))
    Next i
    
    
 End Sub

如果您运行该代码,您可以看到从数据对象派生的字符串有一个额外的换行符和回车符,ascii 代码分别为 10 和 13。

避免这种情况的最简单方法是跳过整个剪贴板/数据对象,直接从范围中提取字符串。

Sub NewMacro1()
    Dim mystring As String
    
    mystring = ActiveSheet.Range("A1").Value
        
    If mystring = "User Name" Then
        MsgBox "Correct Column"
    End If
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    相关资源
    最近更新 更多