天道酬勤,学无止境

在 VBA 函数中返回一个带有上标字符的字符串(Return a string with superscript characters in VBA function)

问题

我在 Excel 中有一个宏,它将十进制度值(赤经)转换为带有小时 (h)、分钟 (m) 和秒 (s) 的天文小时角。 有什么办法可以返回带有上标缩写 h,m,s 的字符串吗?

这是我的 Excel 宏:

Function Convert_Hours(Decimal_Deg) As Variant
    With Application
        hours_dec = Decimal_Deg / 360 * 24
        hours = Int(hours_dec)

        minutes_dec = hours_dec - hours
        minutes = Int(minutes_dec)

        seconds = minutes_dec - minutes

        Convert_Hours = " " & hours & "h " & minutes & "m " & Round(seconds, 2) & "s "
    End With
End Function

因此,例如在单元格 A1 中我写176.7854并在单元格 B1 =Convert_Hours(A1) 。 将11h 0m 0.79s写入单元格 B1。 但我想要的是:11 h 0 m 0.79 s

我不想(!)想用 VBA 引用一些选定的单元格,然后应用类似c.Font.Superscript = True东西,这是在 VBA 中搜索上标字符串时的标准答案。 我的函数Convert_Hours()应该自己返回一个格式化的字符串。

先感谢您!

回答1

由于字符串只能包含单个字符而无需格式化,因此实现不格式化的唯一方法是找到代表上标小写字母的Unicode字符。

上标拉丁字母没有完整的 Unicode 块。 所以我们需要从不同的块中提取那些。 我们可以在 Latin_script_in_Unicode 中找到概述。

我们可以在间距修饰字母中找到 ʰ 和 ˢ。 我们可以在语音扩展中找到 ᵐ。

如果我们找到了字符,我们必须知道如何将它们连接到VBA的字符串中。 为此,可以使用ChrW功能。 它需要字符的十进制代码。

所以

...
Convert_Hours = " " & hours & ChrW(688) & " " & minutes & ChrW(7504) & " " & Round(seconds, 2) & ChrW(738)
...

几乎会得到你想要的。 但是上标字母的大小会有所不同,因为它们来自不同的 Unicode 块。 所以我更喜欢在字符串中使用默认字母并稍后将它们格式化为上标。 当然,这不能在用户定义函数 (UDF) 中完成。


根据@arcadeprecinct 的评论

...
Convert_Hours = " " & hours & ChrW(&H2B0) & " " & minutes & ChrW(&H1D50) & " " & Round(seconds, 2) & ChrW(&H2E2)
...

也将使用十六进制工作。

回答2

总是对我有用的简单建议:(1)转到编程选项卡并开始录制宏; (2) 选择一个之前添加过字符串的单元格; (3) 点击公式栏(屏幕上半部分),选择字符串的一部分并标记为上标; (4) 停止录制,查看生成的代码。 这将向您展示这是如何完成的。

这是我刚刚生成的一个示例:

    Sub Macro1()
    '
    ' Macro1 Macro
    '

    '
        ActiveCell.FormulaR1C1 = "asd sad ads asd asd asd "
        With ActiveCell.Characters(Start:=1, Length:=12).Font
            .Name = "Arial"
            .FontStyle = "Regular"
            .Size = 11
            .Strikethrough = False
            .Superscript = False
            .Subscript = False
            .OutlineFont = False
            .Shadow = False
            .Underline = xlUnderlineStyleNone
            .ThemeColor = xlThemeColorLight1
            .TintAndShade = 0
            .ThemeFont = xlThemeFontMinor
        End With
        With ActiveCell.Characters(Start:=13, Length:=7).Font
            .Name = "Arial"
            .FontStyle = "Bold"
            .Size = 11
            .Strikethrough = False
            .Superscript = True
            .Subscript = False
            .OutlineFont = False
            .Shadow = False
            .Underline = xlUnderlineStyleNone
            .ThemeColor = xlThemeColorLight1
            .TintAndShade = 0
            .ThemeFont = xlThemeFontMinor
        End With
        With ActiveCell.Characters(Start:=20, Length:=5).Font
            .Name = "Arial"
            .FontStyle = "Regular"
            .Size = 11
            .Strikethrough = False
            .Superscript = False
            .Subscript = False
            .OutlineFont = False
            .Shadow = False
            .Underline = xlUnderlineStyleNone
            .ThemeColor = xlThemeColorLight1
            .TintAndShade = 0
            .ThemeFont = xlThemeFontMinor
        End With
        Range("D4").Select
    End Sub

希望这对你有帮助。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • React Native 中的上标文本(Superscript Text in React Native)
    问题 我想在 React Native 中将文本样式设置为上标。 这将如何实现? 有没有办法利用 Javascript sup()字符串方法在<Text>对象中返回一个字符串作为上标? 回答1 我使用视图容器和 flex 为我工作。 <View style={{flexDirection: 'row', alignItems: 'flex-start'}}> <Text style={{fontSize: 20, lineHeight: 30}}>10</Text> <Text style={{fontSize: 11, lineHeight: 18}}>am</Text> </View> 这是此操作的链接 https://repl.it/Haap/0 干杯! 回答2 只需使用 fontSize、lineHeight、textAlignVertical: <Text style={{fontSize:20, lineHeight:22}}> foo <Text style={{fontSize:20 * 1.6, lineHeight:22 * 1.1, textAlignVertical: 'top'}}> bar </Text> </Text> 回答3 Javascripts sub()函数只会用<sub></sub>标签包围你的文本,它们在 RN 中被识别为文本。
  • Excel 字符串解析(Excel String Parsing)
    问题 我有一个电子表格,它使用字符串约定来传达有关单个“案例”的详细程度。 约定如下: 字符串中的数据有 5 个主要类别。 1=类别,2=工具,3=文档,4=过程,5=工作辅助。 每个类别可以有多个子类别,每 5 个类别按 1a、1b、1c 或 2a、2b、2c 等细分。 主类别与子类别用“:”分隔,子类别与子类别用“”分隔,而子类别与新的主类别用“;”分隔。 字符串示例:“1:1i;2:2a;3:3a,3d,3l;4:4a” 以下是按值分类的示例细分: CATEGORY 1 Incorrect:VG:QOC 1i TOOLS 2 Macro:Used 2a DOCUMENTATION 3 TAT:Missing 3a ROUTING:Missing 3d STORY:Missing Impact to Health 3i PROCESS 4 CNX Checklist Not Used 4a 我希望能够以文本形式提取主要类别和子类别被标记的内容。 示例查询: 在所有字符串中,主类别 4 被标记了多少次? 在所有 4 个标记中,4a 标记了多少次? 在一个“案例”或字符串上标记的所有元素是什么? 我可以构建字符串,但我无法解析它们。 请帮忙... :) 回答1 您要查找的函数是 Split(此链接适用于 VB 函数,但在 VBA 中的行为几乎相同)。
  • 是否可以用特殊的方式写 10^2?(Is it possible write 10^2 in a special way?)
    问题 是否可以在 C# 中编写10²或10³ ? 例如在标签或控制台输出中。 我还想将它用于其他权力(10 4 , 10 5 ,...)。 就像是: string specialNumber = string.Format("10^4"); System.Console.Write(specialNumber); 回答1 这真的是两个不同的问题。 一种用于控制台,一种用于 GUI 应用程序。 我选择覆盖控制台。 如果你只需要 2 和 3 的幂,你可以这样做: Console.WriteLine("10²"); Console.WriteLine("10³"); 这使用了字符 U+00B2 和 U+00B3。 如果事实证明您需要不同的能力,那么您在控制台上就不走运了。 虽然其他数字有 Unicode 字符,但字体支持很差,这样的代码不会成功: Console.WriteLine("10⁴"); Console.WriteLine("10⁵"); Console.WriteLine("10⁶"); // etc. 许多常用的控制台字体不包括这些字符的上标字形。 例如,这就是我使用 Consolas 的机器上的样子: 如果你使用的是 Lucinda Console 的默认控制台字体,那么结果是一样的。 回答2 这是上标和下标 维基百科 这是在 c# 中转义 unicode 字符的方法
  • Excel VBA:将变体数组返回到选定范围时需要解决 255 个转置字符限制(Excel VBA: Need Workaround for 255 Transpose Character Limit When Returning Variant Array to Selected Range)
    问题 我正在努力解决一个涉及明显的 Excel 255 个字符限制的常见问题。 尝试将变量数组从函数返回到工作表上的选定范围时遇到错误。 当函数返回数组中的每个单元格都低于 255 个字符时,它们会按照应有的方式发布到工作表:在选定范围内的每个单元格中出现一个元素。 但是,如果我返回的变体数组中的任何元素长于 255 个字符,我就会得到一个值! 错误。 这些错误很糟糕,因为我需要长元素并希望将数据保存在一起! 这个问题的版本在许多论坛中一遍又一遍地出现,但是当数组单元格超过 255 个字符时,我能够找到一个清晰简单的通用解决方案,用于将变体数组返回到所选范围(不一定包含公式)。 我最大的元素大约是 1000 个,但如果解决方案可以容纳多达 2000 个字符的元素会更好。 最好,我希望用一个函数或可以添加到我的函数(不是子例程)中的附加代码行来实现。 我想避免使用子程序的原因:我不想对任何范围进行硬编码。 我希望这很灵活,并且输出位置可以根据我当前的选择动态变化。 拜托,如果您能帮助找到一种方法来生成一个函数,它将一个变体数组作为输入,并保持所需的数组:单元格 1:1 关系,我将不胜感激。 所以这个带有短信元的功能有效: Function WriteUnder255Cells() Dim myArray(3) As Variant 'this the variant array I
  • VBA,路径的修剪部分(VBA, TRIM part of a Path)
    问题 假设我有一条路径: stack/overflow/question/help/please 。 最终结果是:帮助/请。 有没有人有代码可以说明我想解析多少个“/”。 它类似于文本到列,但我想将它保存在一个单元格中。 谢谢 回答1 你可以写一个这样的函数: Function RightPart(s As String, d As String, n As Long) As String Dim A As Variant Dim i As Long, ub As Long Dim t As String A = Split(s, d) ub = UBound(A) If n >= ub Then RightPart = s Exit Function End If For i = ub - n + 1 To ub t = t & A(i) & IIf(i < ub, d, "") Next i RightPart = t End Function 然后RightPart(":stack/overflow/question/help/please","/",2)评估为"help/please" 回答2 你可以使用这个代码(做多一点但应该没问题): Public Function custDelim(ByVal str As String, ByVal delim As String
  • 在VBA函数调用中,括号的使用规则是什么?(What are the rules governing usage of brackets in VBA function calls?)
    问题 由于我在传递给我定义的Sub的参数周围使用方括号引起的VBA(Access 2003)中的“编译器错误”,我刚刚经历了30分钟的烦人。 我一直在寻找关于什么时候需要/适当/不适当/禁止使用方括号的体面的文章/教程/说明,但是找不到任何明确的指南。 回答1 从这里: 使用VBScript调用语句调用子例程当您希望调用子例程时,使用调用语句是可选的。 与Sub一起使用时,Call语句的目的是允许您将参数列表括在括号中。 但是,如果子例程未传递任何参数,则在使用Call语句调用Sub时,仍不应使用括号。 Call MySubroutine 如果子例程具有参数,则在使用Call语句时必须使用括号。 如果有多个参数,则必须用逗号分隔参数。 Call MySubroutine(intUsageFee, intTimeInHours, "DevGuru") 调用函数有两种可能的方法来调用函数。 您可以直接调用该函数(仅按名称),也可以使用VBScript Call语句来调用它。 按名称调用函数当按名称直接调用函数并且没有对返回值的赋值时,以下所有均为合法语法: MyFunction MyFunction() MyFunction intUsageFee, intTimeInHours, "DevGuru" 如果需要返回值,可以将函数分配给变量。 请注意,如果有一个或多个参数,则必须使用括号
  • 带有字符串参数的 VBA 评估函数(VBA Evaluate function with string arguments)
    问题 我有这个函数工作(它返回文本 DK001 在 ID 范围内的行) Found = Application.Evaluate("=IF(ID=""DK001"",ROW(ID),""x"")") 我想将搜索条件(例如 DK001)作为字符串提供,例如 Found = Application.Evaluate("=IF(ID=SearchString,ROW(ID),""x"")") 我无法创建被接受为搜索条件的字符串。 我需要你的帮助! 我究竟做错了什么? 这个评估功能困扰着我...... 如果我现在想向函数发送一个值(不是字符串)怎么办? Found = Application.Evaluate("=IF(ID=1,ROW(ID),""x"")") 以上有效! 但如果我希望这是一个变量 Found = Application.Evaluate("=IF(ID=MyValue,ROW(ID),""x"")") 然后怎样呢? 回答1 双"将它们包含为文字: SearchString = "DK001" Found = Application.Evaluate(""=IF(ID=""" & SearchString & """,ROW(ID),""x"")") 回答2 使用 stdVBA,您可以使用stdLambda来完成此操作,如下所示: set lambda =
  • 在VBA中使用StrPtr函数有什么好处和风险?(What are the benefits and risks of using the StrPtr function in VBA?)
    问题 在寻找一种测试用户何时取消InputBox ,我偶然发现了StrPtr函数。 我相信它会检查变量是否曾经赋值,如果从未赋值,则返回零,如果是,则返回某个隐数。 似乎是个有用的功能! 我从以下代码开始: Dim myVar as string myVar = InputBox("Enter something.") MsgBox StrPtr(myVar) 如果用户取消,消息框将显示为零。 极好的! 但是,为什么有人坚持不使用StrPtr ? 我读到它不受支持。 为什么这么重要? 一个好的答案将说明使用StrPtr函数的好处(除了上面的示例之外)和风险,可能还会说明您如何使用(或不使用)该函数而没有给出是否每个人都应该使用它的意见。 回答1 tldr; 像这样使用StrPtr没有真正的风险,但是也没有真正的好处。 虽然看起来您从InputBox调用返回了一个空指针,但实际上却没有。 比较StrPtr和VarPtr的结果: Sub Test() Dim result As String result = InputBox("Enter something.") 'Hit cancel Debug.Print StrPtr(result) '0 Debug.Print VarPtr(result) 'Not 0. End Sub 这是因为InputBox返回了带有VT
  • 如何在Swift中使用下标和上标?(How do I use subscript and superscript in Swift?)
    问题 我希望我的UILabel以以下方式显示文本6.022 * 10 23 。 Swift对于下标和上标有哪些功能? 回答1 大多数答案和示例都在ObjC中,但这是在Swift中的方法。 let font:UIFont? = UIFont(name: "Helvetica", size:20) let fontSuper:UIFont? = UIFont(name: "Helvetica", size:10) let attString:NSMutableAttributedString = NSMutableAttributedString(string: "6.022*1023", attributes: [.font:font!]) attString.setAttributes([.font:fontSuper!,.baselineOffset:10], range: NSRange(location:8,length:2)) labelVarName.attributedText = attString 这给了我: 在更详细的说明中: 获取默认样式和上标样式UIFont ,上标必须较小。 创建具有完整字符串和默认字体的NSMutableAttributedString 。 使用较小的/下标UIFont向要更改的字符( NSRange )添加一个属性
  • 超过 Excel 中的最大字符限制(Exceeding Max Char Limit in Excel)
    问题 如何在 Excel 的 CONCATENATE 函数中使用超过 255 个字符? 我实际上也在 EXCEL 的 HYPERLINK 函数中使用了 CONCATENATE 函数。 一个示例如下所示: =HYPERLINK(CONCATENATE("http://www.google/com/morethan255charsmorethan255charsmorethan255charsmorethan255charsmorethan255charsmorethan255charsmorethan255charsmorethan255charsmorethan255charsmorethan255chars","morethan255chars morethan255charsmorethan255charsmorethan255charsmorethan25"),"link"); 更新:这不是 CONCATENATE 函数的问题,而是 HYPERLINK 函数的第一个参数的问题。 直接/间接使用超过 255 个字符的字符串(例如:=HYPERLINK(K204,"link"),其中 K204 包含 256 个字符长度的链接)会使 HYPERLINK 函数失败 我意识到我可以使用 URL 缩短器,但我正在为大量需要手动使用 URL 缩短器的链接执行此操作。 回答1 更新:由于
  • 如何从字符串中找到数字?(How to find numbers from a string?)
    问题 我需要从一个string找到数字。 如何在VBA Excel中从string中找到数字? 回答1 假设您想删除非数字,则应该可以使用类似以下的方法: Function onlyDigits(s As String) As String ' Variables needed (remember to use "option explicit"). ' Dim retval As String ' This is the return string. ' Dim i As Integer ' Counter for character position. ' ' Initialise return string to empty ' retval = "" ' For every character in input string, copy digits to ' ' return string. ' For i = 1 To Len(s) If Mid(s, i, 1) >= "0" And Mid(s, i, 1) <= "9" Then retval = retval + Mid(s, i, 1) End If Next ' Then return the return string. ' onlyDigits = retval End Function 通过以下方式调用
  • 如何在VBA中安全存储连接字符串详细信息(How to securely store Connection String details in VBA)
    问题 我有一个Excel模板,该模板在VBA代码中已对Ms Access MDB路径进行了硬编码,用于连接到Access表并保存,检索数据。 我将MS Access数据库迁移到了具有Excel模板用户集成身份验证的SQL Server。 我的问题是,用于存储SQL Server DB连接字符串并将其检索到Excel 2007 VBA中以保存和检索数据的“推荐方式/最佳实践”是什么? 过去,我做了以下工作。 使用具有连接字符串的注册表项设置。 然后在VBA中,编写一个读取注册表项并返回连接字符串的函数。 在Excel模板中有一个“设置”隐藏的工作表,带有用于连接字符串的命名单元格。 通过访问该命名范围来读取VBA中的连接字符串。 使用Excel模板随附的.INI txt文件。 (这不是理想的选择,我想避免这种情况,因为它会依赖于该外部文件) 我不喜欢#1,因为我想尽可能避免写入注册表或从注册表中读取。 #2感觉还不错,以为我不确定是否有更好的“清洁”方法来执行此操作。 有什么想法吗? 回答1 这就是我将安全存储连接字符串凭据的方式 下载并安装适用于Windows的Visual Studio Express 2012(免费) 以管理员身份打开它并创建一个新项目。 选择“ Visual C#然后选择“ Class Library
  • Excel VBA中的ByRef参数类型不匹配(ByRef argument type mismatch in Excel VBA)
    问题 我正在使用VBA。 我编写了一个用户定义函数,该函数接受一个string ,对其进行处理并返回一个已清理的string 。 我不确定这是怎么回事。 我无法调用它并要求它处理我的字符串并返回它。 我认为我定义或返回的方式有误。 Public Function ProcessString(input_string As String) As String ' The temp string used throughout the function Dim temp_string As String For i = 1 To Len(input_string) temp_string = Mid(input_string, i, 1) If temp_string Like "[A-Z, a-z, 0-9, :, -]" Then return_string = return_string & temp_string End If Next i return_string = Mid(return_string, 1, (Len(return_string) - 1)) ProcessString = return_string & ", " End Function 我像这样使用此功能 Worksheets(data_sheet).Range("C2").Value =
  • 将字符串从 VBA 传递到 C++ DLL(Passing strings from VBA to C++ DLL)
    问题 我真的很困惑将字符串从 VBA 传递到 C++。 这是 VBA 代码: Private Declare Sub passBSTRVal Lib "foo.dll" (ByVal s As String) Private Declare Sub passBSTRRef Lib "foo.dll" (ByRef s As String) Private Declare Sub passByNarrowVal Lib "foo.dll" (ByVal s As String) Private Declare Sub passByNarrowRef Lib "foo.dll" (ByRef s As String) Private Declare Sub passByWideVal Lib "foo.dll" (ByVal s As String) Private Declare Sub passByWideRef Lib "foo.dll" (ByRef s As String) Sub foobar() Dim s As String, str As String str = "Hello There, World!" s = str Call passByBSTRVal(s) s = str Call passByBSTRRef(s) s = str Call
  • 去除SELECT中的非数字字符(Strip out non-numeric characters in SELECT)
    问题 在MS Access 2007项目报告中,我有以下(已编辑)查询: SELECT SomeCol FROM SomeTable 问题在于, SomeCol显然包含一些不可见的字符。 例如,我看到一个结果返回为123456但是SELECT LEN(SomeCol)返回7 。 当我将结果复制到Notepad ++时,它显示为?123456 。 该列设置为TEXT 。 我无法控制此数据类型,因此无法更改。 如何修改SELECT查询以去除任何非数字内容。 我怀疑正则表达式是要走的路...或者,是否有CAST或CONVERT函数? 回答1 您提到为此使用正则表达式。 的确,Access的数据库引擎不直接支持正则表达式。 但是,似乎您愿意在查询中使用VBA用户定义的函数...并且UDF可以使用正则表达式方法。 与遍历输入字符串的每个字符并仅将要保留的字符存储在新的输出字符串中相比,该方法应该简单,容易且执行速度更快。 Public Function OnlyDigits(ByVal pInput As String) As String Static objRegExp As Object If objRegExp Is Nothing Then Set objRegExp = CreateObject("VBScript.RegExp") With objRegExp .Global
  • 有没有一种简单的方法可以使 NSString 对象的一部分成为上标或下标?(Is there an easy way to make part of an NSString object a superscript or subscript?)
    问题 例如,假设我有一个 NSString @"20O(2H,1H)19O",并且我希望所有数字都是上标。 是否有捷径可寻? 回答1 我想你可能想要带有 NSSuperScriptAttributeName 的 NSAttributedString。 如果您需要将其保存在NSString ,则 unicode 具有用于上标数字的字符。 回答2 此函数应以上标形式返回给定的数字。 很简单的 -(NSString *)superScriptOf:(NSString *)inputNumber{ NSString *outp=@""; for (int i =0; i<[inputNumber length]; i++) { unichar chara=[inputNumber characterAtIndex:i] ; switch (chara) { case '1': NSLog(@"1"); outp=[outp stringByAppendingFormat:@"\u00B9"]; break; case '2': NSLog(@"2"); outp=[outp stringByAppendingFormat:@"\u00B2"]; break; case '3': NSLog(@"3"); outp=[outp stringByAppendingFormat:@"\u00B3
  • Excel VBA 如果 cell.Value =... 那么(Excel VBA If cell.Value =… then)
    问题 我有这个运行良好的代码: Sub colortest() Dim cell As Range For Each cell In Range("Range1") If cell.Value = "Word1" Then cell.Interior.Color = XlRgbColor.rgbLightGreen ElseIf cell.Value = "Word2" Then cell.Interior.Color = XlRgbColor.rgbOrange ElseIf cell.Value = "Word3" Then cell.Interior.Color = XlRgbColor.rgbRed End If Next cell End Sub 我的问题是这些值仅在单元格仅包含该文本时才起作用。 但是我的单元格通常是这样的:“Something, 10254, 15/15, Word1 Another Word” 我只需要Word1 。 谢谢, 回答1 您可以通过使用确定是否在单元格中找到某个单词 If InStr(cell.Value, "Word1") > 0 Then 如果在字符串中找到 Word1, InStr()函数将返回字符串中 Word1 的第一个字符的位置。 回答2 我认为在 Excel 中使用“查找”函数而不是 For Each 循环会更有意义。
  • VBA哈希字符串(VBA hash string)
    问题 如何使用Excel VBA获得长字符串的短哈希 给出了什么 输入字符串不能超过80个字符有效的输入字符为:[0..9] [A_Z]。 _ / 有效的输出字符为[0..9] [A_Z] [a_z] (可以使用小写和大写) 输出哈希值不得超过〜12个字符(越短越好) 完全不需要唯一,因为这将导致哈希值过长 到目前为止我做了什么 我认为这个SO答案是一个好的开始,因为它会生成一个4位数的十六进制代码(CRC16)。 但是4位数字很少。 在我用400个字符串进行的测试中,有20%的字符串在其他地方得到了重复。 产生碰撞的机会太高。 Sub tester() For i = 2 To 433 Cells(i, 2) = CRC16(Cells(i, 1)) Next i End Sub Function CRC16(txt As String) Dim x As Long Dim mask, i, j, nC, Crc As Integer Dim c As String Crc = &HFFFF For nC = 1 To Len(txt) j = Val("&H" + Mid(txt, nC, 2)) Crc = Crc Xor j For j = 1 To 8 mask = 0 If Crc / 2 <> Int(Crc / 2) Then mask = &HA001 Crc =
  • 克服 VBA 输入框字符限制(Overcome VBA InputBox Character Limit)
    问题 我用来收集文本InputBox的当前函数显然不能接受超过255个字符,而我需要能够收集更多的字符吗? 是否可以使用参数或其他函数来增加此限制? 回答1 为了学究,输入框最多可让您输入 255 个字符,但它只会返回 254 个字符。 除此之外,是的,您需要创建一个带有文本框的简单表单。 然后只需制作一个小“辅助功能”,例如: Function getBigInput(prompt As String) As String frmBigInputBox.Caption = prompt frmBigInputBox.Show getBigInput = frmBigInputBox.txtStuff.Text End Function 或类似的东西... 回答2 感谢 BradC 提供的信息。 我的最终代码大致如下,我有一个按钮调用我创建的表单并将其定位,因为我在第一次使用后每次都遇到表单位于错误位置的问题。 Sub InsertNotesAttempt() NoteEntryForm.Show With NoteEntryForm .Top = 125 .Left = 125 End With End Sub 用户窗体是一个文本框和两个命令按钮(取消和确定)。 按钮的代码如下: Private Sub CancelButton_Click() Unload
  • VBA,在列中搜索特定字符,提取直至该字符的字符串(VBA, search in column for specific character, extract string upto that character)
    问题 在特定的列中,我想在单元格中搜索特定的字符...说“(”或“ /”。在单元格中找到此字符后,我要从字符串的开头提取到该部分。指向在与它相邻的单元格中找到此字符的位置。 例如,列中的一些值可能看起来像- Samsung (india) Samsung/Dhamal Blackberry (chikna) Blackberry/Kala Anda iPhone - egypt iPhone 5 * yeda 输出看起来像- Samsung Samsung Blackberry Blackberry iPhone iPhone 5 注意:该特定列中的单元格值不是静态的,没有模式,也可能包含其他特殊字符,并且没有特定的长度。 回答1 这个问题非常适合正则表达式。 以下函数返回给定字符串中简单正则表达式模式的第一个匹配项之前的字符位置。 如果找不到匹配项,该函数将返回字符串的长度。 该功能可以与LEFT功能结合使用,以提取匹配之前的文本。 (必须使用LEFT,因为为简单起见,此函数未实现子匹配。 ) 以下公式将在示例数据中提取产品名称: =LEFT(A1,regexmatch(A1," \(|\/| -| \*")) 分解匹配模式" \(|\/| -| \*" : " \(" matches a space followed by a left parenthesis [the