用过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. M函数目录(Power Query 之 M 语言)

    2021-12-11更新 主页(选项卡) 管理列(组) 选择列 选择列Table.SelectColumns 删除列 删除列Table.RemoveColumns 删除其他列Table.SelectC ...

  2. mysql如何查询某个库,某个表都有哪些字段

    如下语句便可查看 SELECT column_name FROM Information_schema.columns  WHERE table_Name = 'columns' AND TABLE_ ...

  3. 【LeetCode】372. Super Pow 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/super-po ...

  4. codeforce-600C. Make Palindrome(贪心)

    http://codeforces.com/problemset/problem/600/C: 题意:给你一个小写字母组成的英文串,将它转换为回文串,要求,改变的字母的个数最小,移动字母不算改变字母. ...

  5. Labeling Balls(poj3687)

    Labeling Balls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13109   Accepted: 3782 D ...

  6. Codeforces1132A——Regular Bracket Sequence(水题)

    Regular Bracket Sequence time limit per test:1 second memory limit per test:256 megabytes input:stan ...

  7. JS常用的获取值和设值的方法

    1. input 标签<input type="text" name="username" id="name"/> 1) 获取i ...

  8. Second Order Optimization for Adversarial Robustness and Interpretability

    目录 概 主要内容 (4)式的求解 超参数 Tsiligkaridis T., Roberts J. Second Order Optimization for Adversarial Robustn ...

  9. 基于Spring MVC + Spring + MyBatis的【学生管理管理系统】

    资源下载:https://download.csdn.net/download/weixin_44893902/45602690 练习点设计:模糊查询.删除.新增 一.语言和环境 实现语言:JAVA语 ...

  10. Office - 0x4004F00C解决方法

    之前用HEU_KMS激活了180天的office 2013(专业版),今天打开突然报错0x4004F00C 大致意思就是提示你:office还有几天将要过期,到时候只能查看文档.表格.ppt,而不能编 ...