用过SAP的凭证批量录入模板(Excel文件)的都知道,一个凭证由【抬头】和多个【行项目】组成,这是一个关于excel两表信息关联的典型场景。

  这里头蕴藏着一个麻烦:当我们需要一次性录入多个凭证时,如何将每个凭证的抬头与行项目关联起来呢?

假定这是一个SAP凭证的excel录入模板,包含多个待录入的凭证:

【抬头】表:

【行项目】表:

  看了表结构,如果实际业务中【抬头】文本跟【行项目】文本要求有一定差异,那么能将两张表关联起来的就剩【号码】字段了。此处【抬头】号码1跟【行项目】号码1说的都是第1个待录入凭证。

  当我们第一层循环是遍历【抬头】表的每一行时,第二层内循环便是遍历该凭证行项目对应的每一行。进一步分解需求,比如号码1,我们需要动态计算号码1在【行项目】的起始和终止行号。小爬能想到的思路有以下三个。

  ①利用excel公式来动态计算;

  ②利用两个字典分别存储某个号码在【行项目】中的首尾行号;

  ③建立个临时表temp,利用sql或Excel自带筛选功能快速筛选出号码等于特定数字(比如1)的数据,写入临时表。

先说方法一:使用match结合countif分别得到首尾行号。

如下图所示:

 

接着说说方法二:使用字典来得到某个凭证行项目的首尾行号

  我们从上至下遍历【行项目】每一行,用字典(key,value)分别存储号码和对应的行号,由于字典【key】的唯一性和可覆盖性,我们永远key对应【号码】,则value永远对应的该key最后一次出现的位置(行号),因为该key第一次存入字典的value(起始行号),随着逐行往下遍历,被不停用新的value(行号)覆盖。

此时我们只需要掌握一个trick,先定义个字典,从上至下遍历,最终存储key(号码)和value(结束行号);紧接着再定义个字典,从下至上遍历,便可存储key(号码)和value(起始行号),你get到这一点了吗?

  完整实现的代码示例(VBA)如下:

 1 Sub voucherEntry()
2 Dim headerSht As Worksheet, itemSht As Worksheet, numberStr As String, startNum As Integer, endNum As Integer, headerMaxRow As Long, itemMaxRow As Long, i As Integer, j As Integer
3 Dim startDic As Object, endDic As Object
4 Set startDic = CreateObject("scripting.dictionary")
5 Set endDic = CreateObject("scripting.dictionary")
6
7 Set headerSht = ThisWorkbook.Sheets("抬头")
8 Set itemSht = ThisWorkbook.Sheets("行项目")
9 headerMaxRow = headerSht.Cells(Rows.Count, 1).End(xlUp) '[抬头]表的最后一行行号
10 itemMaxRow = itemSht.Cells(Rows.Count, 1).End(xlUp) '[行项目]表的最后一行行号
11 For i = 2 To itemMaxRow
12 endDic.Add CStr(itemSht.Range("A" & i).Value), i '将号码与对应行号的关系存入字典,思考下,为啥要转为字符串格式
13 Next
14
15 For i = itemMaxRow To 2 Step -1
16 startDic.Add CStr(itemSht.Range("A" & i).Value), i '将号码与对应行号的关系存入字典,思考下,为啥要转为字符串格式
17 Next
18
19 For i = 2 To headerMaxRow '遍历【抬头】表每一个抬头行
20 numberStr = CStr(headerSht.Range("A" & i).Value) '【号码】,思考下,为啥要转为字符串格式
21 startNum = startDic(numberStr) '凭证对应的起始行号
22 endNum = endDic(numberStr) '凭证对应的结束行号
23 For j = startNum To endNum '遍历该凭证行项目的每一行
24 【代码块】
25 Next
26
27 Next
28
29 End Sub

至于方法三,小爬就暂时不对此进行具体实现了,感兴趣的同学不妨自己动手尝试一波~

快来扫码关注我的公众号 获取更多爬虫、数据分析的知识!

解决excel两表之间数据关联关系,知道这几招就够了的更多相关文章

  1. EF Core中如何正确地设置两张表之间的关联关系

    数据库 假设现在我们在SQL Server数据库中有下面两张表: Person表,代表的是一个人: CREATE TABLE [dbo].[Person]( ,) NOT NULL, ) NULL, ...

  2. JS之document例题讲解1(两张表之间数据转移、日期时间选择、子菜单下拉、用div做下拉菜单、事件总结)

    作业一:两个列表之间数据从一个列表移动到另一个列表 <div style="width:600px; height:500px; margin-top:20px"> & ...

  3. Kettle 实现mysql数据库不同表之间数据同步——实验过程

    下面是试验的主要步骤: 在上一篇文章中LZ已经介绍了,实验的环境和实验目的. 在本篇文章中主要介绍侧重于对Kettle ETL的相应使用方法, 在这里LZ需要说明一下,LZ成为了避免涉及索引和表连接等 ...

  4. 一条sql解决.一张表的数据复制到另外一张表

    如何把一个表的数组复制到一张表?也许很多人会把这个表查出来的数据再插入到另外一张表里面,这样很麻烦又要写代码逻辑去处理,其实一条sql语句就可以把一张表的数据复制到另外一张表,或者一张表的某一条数据复 ...

  5. EXCEL批量导入到Sqlserver数据库并进行两表间数据的批量修改

    Excel 大量数据导入到sqlserver生成临时表并将临时表某字段的数据批量更新的原表中的某个字段 1:首先要对EXCEL进行处理 列名改成英文,不要有多余的列和行(通过ctrl+shift 左或 ...

  6. Oracle 通过dblink和job方式实现两个数据库表之间数据同步

    需求是需要将Database_A中的dev_test表中的数据同步到Database_B中的dev_test表中. 因为是通过Database_B去同步Database_A库中的数据,所以操作都建立在 ...

  7. 5月9日 python学习总结 外键、表之间的关联关系、修改表、清空表内容、复制表

    一.外键foreign key    外键约束: 1.必须先创建被关联表才能创建关联表 2.插入记录时,必须先插入被关联表的记录,才能插入关联表(要用到被关联表)的记录 3.若不设置同步更新和同步删除 ...

  8. EXCEL 跨表比较数据

    Public Sub Compare(fullname As String, sheet As String) Dim conn, sql, rows, i, cellContents ,rowInd ...

  9. excel跨表查询数据

    环境:公司部分部门进行商品盘点,店铺经理要求不经过系统进行盘点,全程采用excel表格处理所示:            左图为总表,右图为首饰部门录入的数据 需求:找出盘点差异(即首饰部商品数量是否和 ...

随机推荐

  1. CF734B Anton and Digits 题解

    Content 有 \(k_2\) 个 \(2\).\(k_3\) 个 \(3\).\(k_5\) 个 \(5\) 和 \(k_6\) 个 \(6\),你可以用这里面的数字来组成 \(256,32\) ...

  2. div中出现滚动条,自动保持在最底端---显示聊天窗口最新的信息

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  3. Struts拦截器设置完的值为什么在页面取不到

    Struts拦截器设置完的值为什么在页面取不到. ActionContext ac = (ActionContext) invocation.getInvocationContext(); ac.pu ...

  4. JAVA实现websocket客户端

    pom依赖 <dependency> <groupId>org.java-websocket</groupId> <artifactId>Java-We ...

  5. VS2015常用的字体 和 插件

    Inconsolata 字体 自己常使用 Inconsolata 作为代码字体, 阅读代码非常舒适. 其他插件 GoToDef.vsix , 查看 声明非常方便. (ctrl+鼠标左键) Viasfo ...

  6. 【LeetCode】1414. 和为 K 的最少斐波那契数字数目 Find the Minimum Number of Fibonacci Numbers Whose Sum Is K

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 贪心 日期 题目地址:https://leetcode ...

  7. 【LeetCode】965. Univalued Binary Tree 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 BFS DFS 日期 题目地址:https://le ...

  8. MongoDB笔记:windows环境安装及连接本地数据库

    下载MongoDB 2.4.9版 mongodb官网下载:http://www.mongodb.org/downloads 直接下载地址:http://fastdl.mongodb.org/win32 ...

  9. Essentially No Barriers in Neural Network Energy Landscape

    目录 梗概 主要内容 path的定义 path的逼近 Mechanical Model Nudged Elastic Band 局部最优 Draxler F, Veschgini K, Salmhof ...

  10. JSP、JSTL标签、EL表达式

    JSP.JSTL标签.EL表达式 1.EL表达式:${} 功能: 获取数据 执行运算 获取web开发的常用对象 2.JSP标签 例如: jsp标签还有很多功能,这里只列举出一种. <jsp:fo ...