gundammarkⅡ 发表于 2019-2-11 12:53

求助:如何用按键精灵处理Excel数据

有表格A和表格B,表格A中的部分行的数据(非全部)需要从表格B里查找出来复制平时都是取表头里名称那列用vlookup函数查找出来的,但这次发行A与B里的名称并不完全一致,B的名称比A要多了几个文字
由于无法得知B的名称多了那些字,暂时只想到用查找功能在B里找出来,再复制过去
于是想到把这些重复劳动交按键精灵,那么怎样才能实现这个操作?

newdasemo 发表于 2019-2-11 13:15

HYNDコン 发表于 2019-2-11 13:36

本帖最后由 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操作。判断功能可以用指定区域找图函数来实现。

gofbayrf 发表于 2019-2-11 14:19

先干掉數據輸入不規范的人吧

readmetxt 发表于 2019-2-11 14:46

本帖最后由 readmetxt 于 2019-2-11 14:49 编辑

=VLOOKUP( 要查找的单元格&"*",目标选区,列数,false)大概是这个意思?

HYNDコン 发表于 2019-2-11 16:26

readmetxt 发表于 2019-2-11 14:46
=VLOOKUP( 要查找的单元格&"*",目标选区,列数,false)大概是这个意思?

这个只能通配后面的字符串有异的情况。前后都加*不知道行不行?比如 "*"&要查找的单元格&"*"

spikedingo 发表于 2019-2-11 16:54

本帖最后由 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]
查看完整版本: 求助:如何用按键精灵处理Excel数据