vb编写一个自动复制手动粘帖的后台程序?
vb吧
全部回复
仅看楼主
level 1
lrjisme 楼主
用途:在某个excel里有5个数,分别在单元格A1,B1,C1,D1,F1里,我打开VB程序后自动复制A1里的数,然后在后台待命,直到我在其他页面里按了CTRL+V粘帖了该数,VB程序自动清空粘贴板并复制B1里的数,以此类推,直到我CTRL+V了最后一个F1里的数,程序结束。
我自己写的,但不准确也不完善,望大神修改完善,非常感谢。
Public Sub Form_Load()
i = 0
str = "C:\Users\Administrator\Desktop\1\1.xslm"
Set m_excel_app = CreateObject("EXCEL.APPLICATION")
Set m_excel = m_excel_app.workbooks.Open(str & ".xlsx")
a(0) = m_excel.Worksheets(5).Range("A1").Value
a(1) = m_excel.Worksheets(5).Range("B1").Value
a(2) = m_excel.Worksheets(5).Range("C1").Value
a(3) = m_excel.Worksheets(5).Range("D1").Value
a(4) = m_excel.Worksheets(5).Range("F1").Value
Clipboard.Clear
Clipboard.SetText a(0)
End Sub
Public Sub Text1_KeyPress(Keycode As Integer, shift As Integer)
If shift = 2 And Keycode = vbKeyV Then
i = i + 1
Clipboard.Clear
Clipboard.SetText a(i)
End If
2020年08月09日 05点08分 1
吧务
level 14
确实蛮多bug的。
1、KeyPress改成KeyDown,才能用Keycode和shift。
2、a数组如果下标从0开始,i 默认值改成-1;或者 i 默认0,a数组下标从1开始获取。
3、Worksheets(5)是工作簿里第5张表。
4、检查str字符串工作簿地址是否正确,前面有 1.xslm 后面又加上了.xlsx。
5、引用Excel才能正常访问文件。
6、所有变量最好事先声明下才不容易报错。
2020年08月09日 06点08分 2
7、如果在其他页面粘贴,应该加入计时器和API来判断粘贴,而不是用KeyPress。 8、粘贴最后一个,用 i 判断是否是a数组上限即可。
2020年08月09日 07点08分
大神,帮我,我不懂api和计时器😂
2020年08月09日 07点08分
我改的发到下面了
2020年08月09日 07点08分
@lrjisme 现在是不是没什么bug了只是只能在窗体内粘贴[滑稽]
2020年08月09日 09点08分
level 1
lrjisme 楼主
Public Sub Form_Load()
dim str as string
dim a(4) as single
dim m_excel_app
dim m_excel
i = -1
str = "C:\Users\Administrator\Desktop\1\1.xslm"
Set m_excel_app = CreateObject("EXCEL.APPLICATION")
Set m_excel = m_excel_app.workbooks.Open(str)
a(0) = m_excel.Worksheets(5).Range("A1").Value
a(1) = m_excel.Worksheets(5).Range("B1").Value
a(2) = m_excel.Worksheets(5).Range("C1").Value
a(3) = m_excel.Worksheets(5).Range("D1").Value
a(4) = m_excel.Worksheets(5).Range("F1").Value
Clipboard.Clear
Clipboard.SetText a(0)
End Sub
Public Sub Text1_Keydown(Keycode As Integer, shift As Integer)
If shift = 2 And Keycode = vbKeyV Then
i = i + 1
Clipboard.Clear
Clipboard.SetText a(i)
End If
2020年08月09日 07点08分 3
level 9
围观
2020年08月10日 01点08分 5
level 11
不知道写这个的意义在哪,如果只是为了把数据复制到另一个表完全可以用Range.copy方法,没必要经过剪切板,还要自己按ctrl+v
2020年08月10日 02点08分 6
level 1
lrjisme 楼主
研究了几天总算写出来了,为了工作太不容易了。
感谢@总裁大人
的提示。
'RECORD??Copy & Paste Specific Data
Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vkey As Long) As Integer
Public m_excel_app
Public m_excel
Public str As String
Public i As Integer
Public a(65) As String
Public Sub Form_Load()
str = "C:\Users\Administrator\Desktop\test.xlsx"
Set m_excel_app = CreateObject("EXCEL.APPLICATION")
Set m_excel = m_excel_app.workbooks.Open(str)
'test datatransfer in
a(0) = m_excel.Worksheets(Day(Now)).Range("G18").Value
a(1) = m_excel.Worksheets(Day(Now)).Range("H18").Value
a(2) = (m_excel.Worksheets(Day(Now)).Range("I18").Value + m_excel.Worksheets(5).Range("I19").Value + m_excel.Worksheets(5).Range("I20").Value) * 10000
a(3) = m_excel.Worksheets(Day(Now)).Range("K21").Value * 10
a(4) = m_excel.Worksheets(Day(Now)).Range("K21").Value * 10
'...
a(65) = m_excel.Worksheets(Day(Now)).Range("AH21").Value * 10
'shutdown app case of exe
m_excel.Close savechanges:=False
Set m_excel = Nothing
m_excel_app.Application.quit
Set m_excel_app = Nothing
'original set
i = 0
Timer1.Interval = 50
Clipboard.Clear
Clipboard.SetText a(0)
End SubPublic Sub Timer1_Timer()
'prevent from pausing
On Error GoTo err
err: If err.Number = 521 Then Resume 0
'-23767 represent one-time exe while keysdown
If GetAsyncKeyState(vbKeyV) = -32767 Then
i = i + 1
re:
Clipboard.Clear
Clipboard.SetText a(i)
'in case if clipboard didn't get data
If Clipboard.GetText <> a(i) Then
GoTo re
'cancel exe while the last data's done
ElseIf i = 65 Then
Timer1.Enabled = False
End If
'for repeat last data
ElseIf GetAsyncKeyState(vbKeyUp) = -32767 Then
i = i - 2
Clipboard.Clear
Clipboard.SetText a(i)
End If
End Sub
2020年08月15日 15点08分 7
1