Vba 从字符串中删除二进制零

Vba 从字符串中删除二进制零,vba,Vba,我不得不将一个完整的目录结构(数千个目录和文件)从Mac移动到PC上,但由于某种原因,现在在PC上,一些文件夹名称的二进制零结尾有一个字符(一些文件夹的中间有一个字符)。我需要清理它,因为它使试图读取这些目录的宏崩溃。 我使用Replace函数(作为遍历目录树的大型程序的一部分)在vba word宏中尝试了以下代码,但Replace函数似乎无法捕获chr(0) Set current\u folder=fso.GetFolder(source\u folder.Path) 当前文件夹名称=当前文

我不得不将一个完整的目录结构(数千个目录和文件)从Mac移动到PC上,但由于某种原因,现在在PC上,一些文件夹名称的二进制零结尾有一个字符(一些文件夹的中间有一个字符)。我需要清理它,因为它使试图读取这些目录的宏崩溃。
我使用Replace函数(作为遍历目录树的大型程序的一部分)在vba word宏中尝试了以下代码,但Replace函数似乎无法捕获chr(0)

Set current\u folder=fso.GetFolder(source\u folder.Path)
当前文件夹名称=当前文件夹名称
已清理的\u文件夹\u名称=替换(当前\u文件夹\u名称,Chr(0),“”)
Selection.TypeText“旧目录名:”&当前文件夹名
选择.类型段落
Selection.TypeText“新目录名:”&已清理的文件夹名
选择.类型段落
如果当前\u文件夹\u名称已清理\u文件夹\u名称,则
当前文件夹名称=已清理的文件夹名称
如果结束
我也试过: 已清理的文件夹名称=替换(当前文件夹名称,Chr(0),“”,1,-1,vbBinaryCompare)

如何让Replace函数将字符串中的二进制0替换为空白

或者是否有人知道清理这些目录和文件名的另一种方法

谢谢, 哈利

这应该可以做到:

Dim OldFolderName As String, NewFolderName As String

OldFolderName = source_folder.Path
If InStr(OldFolderName, Chr(0)) > 0 Then
    'NewFolderName = Application.Clean(OldFolderName) 'Works on some versions
    NewFolderName = Application.WorksheetFunction.Clean(OldFolderName) 'By Gene Skuratovsky
    Name OldFolderName As NewFolderName
End If

Edit2:可能最好使用
Clean()
方法。

您可以编写一个自定义循环函数来确定您遇到问题的字符:

OldFolderName = source_folder.Path
For x = 0 To 255
    If InStr(OldFolderName, Chr(x)) > 0 Then
        MsgBox "Chr(" & x & ") is found at position " & InStr(OldFolderName, Chr(x))
    EndIf
Next x
在我的例子中,Replace()和InStr()不能与Chr(0)一起使用(看不到它没有显示任何错误),但是可以通过以下方式进行删除,例如:

If Mid$(str, 1, 1) = Chr$(0) Then str = Mid$(str, 2)
If Mid$(str, Len(str), 1) = Chr$(0) Then str = Left$(str, Len(str) - 1)

这是从端点删除空值,例如从
objFile.ExtendedProperty(“维度”)
值中删除空值,如“?600 x 400?”。空值(?)在Windows 10中此处安装,但在Windows XP中不安装。

首先,您希望
Chr(0)
替换为
空格
还是
?因为您的
replace()
函数中现在有一个空格。我可能会在我的程序中进行一个测试,如果Chr(0)在末尾,则没有其他空格。我会试试你的解决办法,然后再给你回复。谢谢。我想这行不通。清除的\u folder\u name=Replace(当前的\u folder\u name,Chr(0),“”)总是在我的代码中执行,但是Chr(0)永远不会被空格替换。您确定字符是
Chr(0)
?添加了一点关于
“\0”的内容
在我的原始答案中。我在windows资源管理器中复制了文件夹名称并将其粘贴到十六进制编辑器中,字符串中的最后一个字符是二进制零。忘记了所有关于
Clean()
方法的事。它应该删除所有“不可打印字符”,如二进制零。用那个方法更新了我的答案。编辑:
Application.Clean()。它不是二进制零(粘贴到十六进制编辑器时变成二进制零)。我将字符串分配给一个字节数组,找出非法字符的含义。然后编写了一个宏,将名称字符串分配给检查非法字符的字节数组。然后输入空白值并重新分配给字符串。谢谢
If Mid$(str, 1, 1) = Chr$(0) Then str = Mid$(str, 2)
If Mid$(str, Len(str), 1) = Chr$(0) Then str = Left$(str, Len(str) - 1)