Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 逐字比较两个相似的字符串并突出差异_Vba_Ms Access - Fatal编程技术网

Vba 逐字比较两个相似的字符串并突出差异

Vba 逐字比较两个相似的字符串并突出差异,vba,ms-access,Vba,Ms Access,我们有两个数据库,应该有匹配的表。我有一个(生产中)报告,比较这些字段,并以MS Access表单(连续表单样式)将它们显示给用户以供更正 这一切都很好,只是很难找到不同之处。如何将这些字段的格式设置为粗体/斜体/彩色 那只懒狗跳过一只棕色的狗 狐狸。” 那只懒狗跳过了树 棕色狐狸。“ (以某种方式高亮显示两个类似文本字段后,更容易看到它们之间的差异) “那只懒狗跳过了一只棕色的狐狸。” “懒惰的狗跳过了棕色的狐狸。” 因为我们讨论的是MS Access中的表单,所以我不抱太大希望。但我知道我不

我们有两个数据库,应该有匹配的表。我有一个(生产中)报告,比较这些字段,并以MS Access表单(连续表单样式)将它们显示给用户以供更正

这一切都很好,只是很难找到不同之处。如何将这些字段的格式设置为粗体/斜体/彩色

那只懒狗跳过一只棕色的狗 狐狸。”
那只懒狗跳过了树 棕色狐狸。“

(以某种方式高亮显示两个类似文本字段后,更容易看到它们之间的差异)

“那只懒狗跳过了一只棕色的狐狸。”
“懒惰的狗跳过了棕色的狐狸。”

因为我们讨论的是MS Access中的表单,所以我不抱太大希望。但我知道我不是第一个有这个问题的人。建议


编辑 我同意雷莫的解决方案。这不是我理想的解决方案,但它“足够好”,特别是因为我没有任何富文本选项。在构建源表的查询中,我使用space()添加尾随空格,使两个字段的长度相等。然后,我将此代码添加到两个字段的单击事件中(另一个字段的TextA和TextB颠倒):

Dim i作为整数
对于i=1到Len(Me.TextA.Text)
如果右(左(Me.TextA.Value,i),1)_
右(左(Me.TextB.Value,i),1)然后
Me.TextA.SelStart=i-1
Me.TextA.SelLength=Len(Me.TextA.Text)
退出
如果结束
接下来我

结果是,当您单击每个字段时,将选择字符串末尾的第一个“不同字母”。我能够很快地进行实验、编写代码和编写文本,所以我就这样做了。但我迟早会重新考虑这个想法,因为这个概念在几个项目中都很有用。

您可以设置selstart和sellength,这将选择文本框的一部分。有一些危险,因为用户可能靠在一个键上并清除选择。

您可以使用富文本框控件进行查看。这将允许您更改字体、粗体、斜体等

有几个问题。如果使用Access 2003或XP,那么您应该避免使用Rich TextBox控件6.0,因为它存在严重的安全问题,Microsoft表示应该不惜一切代价避免使用


如果您使用的是2003或XP,您可以查看此富文本控件的旧版本,但应与2003和XP一起使用。我从未亲自使用过它,所以我不确定它的工作情况如何。

在最后两个版本中,富文本被支持并内置到ms access中。因此,您可以构建如下屏幕:

上面的第三列仅绑定到一个函数,该函数显示两列之间的差异。以上是第3列/功能的实际屏幕截图,代码如下

代码如下:

bolSame = True
i1 = 1: i2 = 1
   For i = 1 To Len(c2t)
      c1 = Mid(c1t, i1, 1)
      c2 = Mid(c2t, i2, 1)
      s = c2
      If c1 = c2 Then
         If bolSame = False Then
            bolSame = True
            s = "</strong></font>" & s
         End If
         i1 = i1 + 1: i2 = i2 + 1
      Else
         If bolSame = True Then
            bolSame = False
            s = "<font color=red><strong>" & s
         End If
         i1 = i1 + 1: i2 = i2 + 1
      End If
      strResult = strResult & s
   Next

If bolSame = False Then
   strResult = strResult & "</strong></font>"
End If
MyCompare = strResult
bosame=True
i1=1:i2=1
对于i=1至Len(c2t)
c1=Mid(c1t,i1,1)
c2=Mid(c2t,i2,1)
s=c2
如果c1=c2,则
如果bolSame=False,则
bosame=True
s=“”&s
如果结束
i1=i1+1:i2=i2+1
其他的
如果bolSame=True,则
bosame=False
s=“”&s
如果结束
i1=i1+1:i2=i2+1
如果结束
strResult=strResult&s
下一个
如果bolSame=False,则
stresult=stresult&“”
如果结束
MyCompare=strResult

我真的不认为这里的问题是产生一个字符串,我认为真正困难的问题是当字符串的长度不同时。在两个字符串中显示差异远非一个简单的编码练习。你当然可以从不同的地方显示,但是突出显示每个差异是一个困难的编码问题。

Access 2007引入了一个经过极大改进的富文本框,它可以理解HTML,如果我觉得做一些事情比@Remou建议选择不同的文本更重要,我会深入研究


我更关心的是如何编写代码,找出两个示例之间的不同之处。在我看来,这似乎是一个非常非常困难的问题。

我已将此网站添加为书签,以备将来使用,但目前,我正在尽可能避免使用未经IT批准的加载项和DLL。上周,我需要我的机器重新成像由于一些。。。提供完整的解决方案。唉,我仍在使用Access 2003,所以我没有这些奇特的富文本选项。另一方面,如果你能想到如何在Access 2003中实现你的解决方案,我肯定会听你的。我认为你到目前为止所拥有的还不错。在上面的示例中,我有2个计数器,这只是为了在不匹配期间能够针对不同长度的字符串分别移动每个计数器。正如您的代码所显示的,当您假设两者的长度相同时,那么我上面的代码可以减少一点。您可以尝试使用Stephan的解决方案或一些第三方插件,但我认为这会带来太多问题。保持解决方案简单通常是这里最好的建议。我认为你不值得花时间来尝试获取富文本或带有鼠标悬停效果的按钮,这些都是access更高版本所具有的。对不起。我应该指定我仍在Access 2003中。您可以使用web浏览器控件,但它不能显示任意HTML,只能显示URL或文件(这意味着编写临时文件以供显示)。对我来说,选择文本是一个简单得多的解决方案。我能够很快地编写代码。有关详细信息,请参见我的编辑。您可以在锁定的文本框中设置选择,否?正确。文本框已锁定,但已启用。如果您将其增强为真正的“红线批注”解决方案(即标记不相等的文本字符串,但不标记未更改的文本),我希望看到结果。IMHO,逐字母查找差异并将其存储在数组中是很容易的。但是展示它们。。。是的,我想看看那些
bolSame = True
i1 = 1: i2 = 1
   For i = 1 To Len(c2t)
      c1 = Mid(c1t, i1, 1)
      c2 = Mid(c2t, i2, 1)
      s = c2
      If c1 = c2 Then
         If bolSame = False Then
            bolSame = True
            s = "</strong></font>" & s
         End If
         i1 = i1 + 1: i2 = i2 + 1
      Else
         If bolSame = True Then
            bolSame = False
            s = "<font color=red><strong>" & s
         End If
         i1 = i1 + 1: i2 = i2 + 1
      End If
      strResult = strResult & s
   Next

If bolSame = False Then
   strResult = strResult & "</strong></font>"
End If
MyCompare = strResult