求助:如何用按键精灵处理Excel数据
有表格A和表格B,表格A中的部分行的数据(非全部)需要从表格B里查找出来复制平时都是取表头里名称那列用vlookup函数查找出来的,但这次发行A与B里的名称并不完全一致,B的名称比A要多了几个文字由于无法得知B的名称多了那些字,暂时只想到用查找功能在B里找出来,再复制过去
于是想到把这些重复劳动交按键精灵,那么怎样才能实现这个操作?
本帖最后由 HYNDコン 于 2019-2-11 13:42 编辑
写脚本,一个比较好的思路是把动作先粗分。讲个脑筋急转弯:如何把大象放进冰箱里?第一步:打开冰箱门;第二步,把大象放进去;第三步,关上冰箱门。博人一笑的急转弯却蕴含着人类处理事情的逻辑。我们可以把一个复杂的操作,拆分成可重复的简单操作,实现这些简单操作的脚本会比较好写。
获取两个Excel的句柄。
A复制表A指定表头()
B用复制内容在B表查询()
C用若干次方向键复制B表内容()
D用若干次方向键粘贴进A表()
E用若干次方向键选中表A下一个表头()
A复制表A指定表头()
B用复制内容在B表查询()
……
然后详写以上子函数的代码即可。
上述操作的关键在于B函数能否成功查询到,如果无法成功查询到,那么要写个判断,让变量:是否成功查询 = 0 ,让CD函数在变量:是否成功查询 = 0 时不工作,即跳过CD操作。判断功能可以用指定区域找图函数来实现。 先干掉數據輸入不規范的人吧 本帖最后由 readmetxt 于 2019-2-11 14:49 编辑
=VLOOKUP( 要查找的单元格&"*",目标选区,列数,false)大概是这个意思?
readmetxt 发表于 2019-2-11 14:46
=VLOOKUP( 要查找的单元格&"*",目标选区,列数,false)大概是这个意思?
这个只能通配后面的字符串有异的情况。前后都加*不知道行不行?比如 "*"&要查找的单元格&"*" 本帖最后由 spikedingo 于 2019-2-11 17:01 编辑
用autoit获取两个excel文件的句柄就可以随意操作了
用stringInStr('B单元格内容', 'B单元格内容中与A相同的部分')函数来确定某一行为对应A内的数据
简单写一下
#include <Excel.au3>
#include <Constants.au3>
Opt('MouseCoordMode', 2)
AutoItSetOption("SendKeyDelay", 100)
; 链接到已打开的excel工作表
Local $excelA = _ExcelBookAttach("A.xlsx" ,"FileName")
Local $excelB = _ExcelBookAttach("B.xlsx" ,"FileName")
; 弹框请求起始循环的行数
Dim $readLine = 1
Dim $readLineB = 1
; Dim $i = 102
; While语句,A表b列没有数据时,则需要从B表取数据
While _ExcelReadCell($excelA,"b"&$readLine) = ""
; 取得A表a列值用于判断
Local $sCheck = _ExcelReadCell($excel,"a"&$readLine)
$readLineB = 1
; B表a列有数据时,进行读取,否则就不再遍历
While _ExcelReadCell($excelB,"a"&$readLineB) <> ""
Local $sStr = _ExcelReadCell($excelB,"a"&$readLineB)
; B表a列的值包含之前存的A表a列标题,则取B表b列的值去粘贴到A表
If StringInStr($sStr, $sCheck) Then
Local $Value = _ExcelReadCell($excelB,"b"&$readLineB)
; 粘贴A表并跳出while
_ExcelWriteCell($excelA, $Value, "b"&$readLine)
ExitLoop
EndIf
$readLineB +=1
WEnd
; 给A表检查完毕栏做个记号
_ExcelWriteCell($excelA, 'done', "c"&$readLine)
$readLine += 1
WEnd
页:
[1]