如何将我的 VBA 宏转换为 C# 以在 Windows 窗体应用程序中使用?

Posted

技术标签:

【中文标题】如何将我的 VBA 宏转换为 C# 以在 Windows 窗体应用程序中使用?【英文标题】:How do I convert my VBA macro to C# to use in windows form application? 【发布时间】:2021-12-11 22:53:28 【问题描述】:

下午好,

我是 C# 的绝对初学者,所以请保持温和。我在 C# 中创建了一个 windows 窗体,但我需要转换以下 VBA 代码,以便我可以在我的窗体中使用它。 我从哪里开始有什么想法吗?我找不到 C# 的 Instr 的等价物

Sub clipboard()

    Dim clipboard As MSForms.DataObject
    Dim strContents As String

    Set clipboard = New MSForms.DataObject
    clipboard.GetFromClipboard
    strContents = clipboard.GetText


    If InStr(1, strContents, "TFR") > 0 Then
    ErrorType = "TFR"
    var1 = WorksheetFunction.Find("ERROR", strContents)
    var2 = WorksheetFunction.Find("TFR", strContents, var1)
    var3 = WorksheetFunction.Find("'", strContents, var2)
    var4 = WorksheetFunction.Find("'", strContents, var3 + 1)
    ErrorIdent = Trim(Mid(strContents, var3 + 1, var4 - var3 - 1))

    End If
    


    Sheet1.Cells(2, 4) = ErrorType
    Sheet1.Cells(2, 6) = ErrorIdent

End Sub

【问题讨论】:

这有帮助吗***.com/questions/31920525/… 我认为自 08 年以来没有太大变化?见:Is it possible to convert VBA to C#? 我投票结束这个问题,因为将代码从一种语言转换为另一种语言被认为超出了 Stack Overflow 的范围。 @braX 我只是在问 C# 中的 VBA 代码的等价物是什么。已经部分回答了。我已将我的代码包含在此问题中,以供将来面临此挑战的任何用户使用.. 【参考方案1】:

大家好,感谢您抽出宝贵时间回答我的问题。 对于偶然遇到此类挑战的任何人,我已经使用下面的代码解决了这个问题。

private void paste_error_Click(object sender, EventArgs e)
    
        string aosinformation = Clipboard.GetText();
        string errorType = "";
        string errorIdent = "";
        string laststring = "";
        string firststring = "";
        string notamerror = "";


        if (aosinformation.IndexOf("notam") > 0)
        
            errorType = "NOTAM";
            int var1 = aosinformation.IndexOf("ERROR");
            int var2 = aosinformation.IndexOf("notam", var1);
            int var3 = aosinformation.IndexOf("'", var2);
            int var4 = aosinformation.IndexOf("'", var3 + 1);
            errorIdent = aosinformation.Substring(var3 + 1, var4 - var3 - 
            1).Trim(' ');

【讨论】:

【参考方案2】:

对于InStr(1, strContents, "TFR") > 0,您可以这样做

strContents.IndexOf("TFR") >= 0 // this need to be done since VB strings start at 1

Strings.InStr(strContents, "TFR", CompareMethod.Text) > 0

或者您可以只使用string.Contains 来获取真/假值

strContents.Contains("TFR") // this is the best since you don't care where it the substring is located

【讨论】:

这将给出一次性错误 - VB InStr 的结果基于 1。你想要 "strContents.IndexOf("TFR") > -1" 你说得对,VB是一门奇怪的语言。 男士们,非常感谢您分享您的专业知识。我会检查一下并在明天报告?

以上是关于如何将我的 VBA 宏转换为 C# 以在 Windows 窗体应用程序中使用?的主要内容,如果未能解决你的问题,请参考以下文章

当我使用相对范围时,VBA会自动将我的范围转换为绝对值

将 VBA 简单宏转换为 LibreOffice 宏

Excel VBA - 组合宏以重命名工作表和宏以在一个宏中合并工作表

如何将活动转换为片段以在抽屉中使用

如何将用Google表格编写的脚本迁移到VBA中的MS Excel宏?

在 ms access 2010 中将嵌入式宏转换为 vba 后,代码不再起作用