excel VBA .SetText和.PutInClipboard将两个符号而不是所需数据放入剪贴板

enxuqcxy  于 2023-03-13  发布在  其他
关注(0)|答案(4)|浏览(217)

使用Excel 2016并引用Microsoft Forms 2.0对象库,我尝试将ActiveCell的内容复制到剪贴板,但剪贴板的结果内容是以下2个符号(如果它们确实显示在此文本字段中的话)。

��

(In在StackOverflow网站的文本编辑器中,这些符号看起来就像白色矩形。根据我粘贴它的文本编辑器,它们也像一个问号,一个包含白色问号的黑色菱形,以及一个空格,就像按下了空格键一样。)
我不想复制任何类型的符号,它是简单的英语。我已经在其他宏中使用了类似的代码,直到今天它仍然有效。代码本身如下。我希望你能帮助!

Dim clipboard As New MSForms.DataObject

clipboard.SetText ActiveCell.Value
clipboard.PutInClipboard

Debug.Print clipboard.GetText(1)    
Set clipboard = Nothing

Debug.Print命令打印出所需的文本,但宏完成后,所需的文本不存在,而是再次出现2个符号。

mfpqipee

mfpqipee2#

对我有效的一个方法是

  • 关闭Excel和文件资源管理器。
  • 重新打开Excel测试放入剪贴板/粘贴的功能
  • 打开Windows 10文件资源管理器
  • 再测一次
  • 我为自己工作为什么?我不知道,但似乎excel必须在文件资源管理器之前打开。
hmae6n7t

hmae6n7t3#

我尝试了另一种方法...
我发现,如果我把剪贴板粘贴到记事本++,然后把同样的文本复制回剪贴板,然后继续使用宏,vba然后继续罚款。
因此,考虑到上述操作,我只是在vba代码中做了同样的事情。
创建第二个数据对象创建文本对象从第一个对象的剪贴板复制文本,将该文本放入第二个对象,然后将第二个对象放入剪贴板。
如下所示(cb是第一个对象,cb2是新的空对象,cbtext是从第一个对象复制文本的字符串)

cb.PutInClipboard   ' this is the only code that was here, but inconsistently failed.
' added this code
' round about way of ensuring copied text pastes as text
    Dim cbtext As String
    cbtext = cb.GetText
    cb2.SetText (cbtext)
    cb2.PutInClipboard
whlutmcx

whlutmcx4#

效果似乎取决于版本,无论资源管理器窗口是在Excel之前还是之后打开。它还取决于资源管理器窗口中的内容-如果是“系统位置”,如“这台PC”,那么putincliboard仍然工作正常。
我已经尝试了很多年的各种选择,但最终找到了一个变通办法-就像手动复制一样。
在这种情况下,要复制到剪贴板的文本位于活动单元格中,但该方法可适用于其他情况:

Sub AACopyText() 'has to be called from Excel workbook (ie not from the VB window!)

SendKeys "{F2}^a^c{ESC}"

End Sub

F2激活单元格的内容,^a选择整个内容,^c将内容复制到剪贴板;则需要{ESC},否则单元格内容将保持活动状态。
如果所需文本不是活动单元内容,例如在变量MyTextToCopy中,则可以临时覆盖活动单元:

AppActivate ActiveWorkbook.Name
    SendKeys "{F2}^a" & MyTextToCopy & "^a^c{ESC}"

这些行激活活动工作簿中的activecell(因此可以在从窗体调用的过程中使用,等等),选择内容,覆盖内容,复制新内容,然后返回原始内容。
或者,可以使用记事本;以下例程将在Excel以外的程序中工作:

Function clip(ClipText As String)
  On Error Resume Next
  Dim WasntOpen As Boolean
  AppActivate ("Notepad")
  If Err Then
    WasntOpen = True
    Err.Clear
    x = Shell("Notepad.exe", vbNormalFocus)
    AppActivate ("Notepad")
  End If
  SendKeys "^a" & ClipText & "^a^c^z"
  If WasntOpen Then SendKeys "%Fx"
End Function

其中'ClipText'是您要保存的文本,例如在例程中,行Clip(“1234”)将把“1234”放到剪贴板上

相关问题