小明 和 VBA 的第一次约会

唠嗑老掉牙的一小段

  我第一次对 EXcel 有感觉,应该是早些年在富士康实践的时候。那时候是在 FQC 岗位做事,有次在过年值夜班比较闲的时候,用了 Excel 做了个工资的计算,其中是利用了 Excel 一些简单的公式来计算的。那时候还很年轻,这个小小的作品也感到小小的喜悦,因为做出来,好多同事也用上了。(那时候工作的电脑只能查看内部网的“新闻”,手机也只能一些干部携带到工作区,数据的拷贝还是用的软盘,没错,就是存储容量1到2 m 容量的软盘)

  这应该是我第一次间接地爱恋了 VBA(Visual Basic for Applications) 吧。



问题的应用场景

  最近我们做了个导出数据表报,其中报表中有图片。考虑到直接在服务器上下载图片并把图片塞到报表中,然后生成文件返回,这样对服务器的内存资源有很大的消耗,我们考虑在客户端实现图片的下载并放置到报表中。

于是我开始看了Excel 的 VBA (Visual Basic for Applications)。这应该就是我和 VBA  阔别多年的第一次约会了。



VBA 实现Excel的图片下载操作。

  查阅了两天的资料,我简单的实现了根据 Excel 表中的某列值(图片链接)下载图片放置到对应行的某列中。

实现思路是:1、遍历 Excel 表中的图片链接列,拿到图片链接;

2、下载图片,把图片文件临时保存到本地磁盘中;

      3、将图片插入到 Excel 的图层中,调整图片的位置以及大小



实现效果

原始报表

在客户端下载图片



VBA 代码

思路简单,代码实现也简单(原始初级low),上代码

  1 ‘download the picture from net
  2 ‘by wmy at 2018/05/14
  3 Option Explicit
  4 Public isLoadImage As Boolean
  5
  6 ‘必须控件:按钮【CommandButton1】,按钮控件的名称为:CommandButton1
  7 ‘使用说明:根据 【图片地址列】 去下载网络图片,放置到对应行的 【下载图片即将放置列】
  8 ‘          根据报表需求,对应修改 【图片地址列】和 【下载图片即将放置列】
  9 ‘          对应参数为:imgUrlColumIdx,imgColumIdx
 10 Private Sub CommandButton1_Click()
 11     Dim txtUrl As String
 12     Dim loadTag As String
 13     Dim Asheet As Worksheet
 14     Dim r As Integer
 15     Dim i As Integer
 16     Dim imgUrlColumIdx As Integer
 17     Dim imgColumIdx As Integer
 18     r = Sheet1.UsedRange.Rows.Count
 19     i = 2
 20     imgUrlColumIdx = 3 ‘URL 图片地址列
 21     imgColumIdx = 4    ‘下载图片即将放置列
 22     Set Asheet = Me
 23     isLoadImage = IsExistPics()
 24     If (isLoadImage = False) Then
 25         Call ClearPics
 26         Do While i <= r
 27             txtUrl = Asheet.Cells(i, imgUrlColumIdx).Value
 28             If VarType(Asheet.Cells(i, imgUrlColumIdx)) > vbEmpty Then
 29                 If VarType(Asheet.Cells(i, imgUrlColumIdx)) = vbString Then
 30                     If VarType(Asheet.Cells(i, imgColumIdx)) = vbEmpty Then DownNetFile txtUrl, "C:\xiaoming-vab-temporary.jpg", i, imgColumIdx
 31                 End If
 32             End If
 33             i = i + 1
 34         Loop
 35         isLoadImage = True
 36     Else
 37         Dim BoxResponse As Variant
 38         BoxResponse = MsgBox("图片已经下载。 " & Chr(13) & "您是想要重新下载所有图片吗?", vbYesNo, "BG报表信息提示")
 39         If BoxResponse = vbYes Then
 40             Call ClearPics
 41             Do While i <= r
 42                 txtUrl = Asheet.Cells(i, imgUrlColumIdx).Value
 43                 If VarType(Asheet.Cells(i, imgUrlColumIdx)) > vbEmpty Then
 44                     If VarType(Asheet.Cells(i, imgUrlColumIdx)) = vbString Then
 45                         If VarType(Asheet.Cells(i, imgColumIdx)) = vbEmpty Then DownNetFile txtUrl, "C:\xiaoming-vab-temporary.jpg", i, imgColumIdx
 46                     End If
 47                 End If
 48                 i = i + 1
 49             Loop
 50             isLoadImage = True
 51         End If
 52     End If
 53 End Sub
 54 ‘download the picture from web,and insert to the active sheet
 55 Private Sub DownNetFile(ByVal nUrl As String, ByVal nFile As String, rowIdx As Integer, colIdx As Integer)
 56 Dim XmlHttp, B() As Byte
 57 Set XmlHttp = CreateObject("Microsoft.XMLHTTP")
 58 XmlHttp.Open "GET", nUrl, False
 59 XmlHttp.Send
 60 If XmlHttp.ReadyState = 4 And XmlHttp.Status = 200 Then
 61 B() = XmlHttp.ResponseBody
 62 Open nFile For Binary As #1
 63 Put #1, , B()
 64 Close #1
 65 End If
 66 Set XmlHttp = Nothing
 67
 68 ‘Dim img As Image
 69 ‘Set img = New Image
 70 ‘Set img.Picture = LoadPicture(nFile)
 71 ‘Me.Cells(rowIdx, colIdx + 1) = img
 72 Dim rng As Variant
 73 Dim FilePath As String
 74 Dim Asheet As Worksheet
 75 Set Asheet = Me
 76 With Asheet
 77     FilePath = nFile
 78     If Dir(FilePath) <> "" Then
 79     .Pictures.Insert(FilePath).Select
 80     Set rng = .Cells(rowIdx, colIdx)
 81     With Selection
 82          .Top = rng.Top + 1
 83          .Left = rng.Left + 1
 84          .Width = rng.Width - 1
 85          .Height = rng.Height - 1
 86     End With
 87 End If
 88 End With
 89 Kill (FilePath)
 90 End Sub
 91 ‘delete all pictures in active sheet, but do not include the buttom
 92 Sub ClearPics()
 93     Dim Shp As Shape
 94     For Each Shp In Me.Shapes
 95     If Shp.Type = 13 Then Shp.Delete
 96     Next
 97 End Sub
 98 ‘is there any picture inserted
 99 Function IsExistPics()
100     Dim isExist As Boolean
101     isExist = False
102     Dim Shp As Shape
103     For Each Shp In Me.Shapes
104         If Shp.Type = 13 Then
105             isExist = True
106             Exit For
107         End If
108     Next
109     IsExistPics = isExist
110 End Function



希望,是看不见的空气,却照在心里的光芒

  第一次约会,写得low!当作学习笔记吧。希望帮助到能帮助的,也希望抛砖引玉,在评论区的VIP沙发上有大神的高见,一起交流学习。



本文路径:http://www.cnblogs.com/youler/p/9046358.html



小明 和 VBA 的第一次约会

原文地址:https://www.cnblogs.com/youler/p/9046358.html

时间: 2024-10-12 17:46:42

小明 和 VBA 的第一次约会的相关文章

记和她的第一次约会

外面下着雨,这时候可以任由思绪飘飞,写点文字最适合不过了.就让我来写写和她的第一次约会吧.准确讲应说是约见了. 和她最初是在网上联系上的.都是为了寻找另一半,注册了同一个相亲网站,或许这就已经是一种缘分吧. 之所以选择相亲网站,是因为现实中遇不到合适的.遇到能聊得上的,感觉若可以,就进一步在现实中约见. 之后就看两人是否有缘分. 最初看到她的资料,最让吸引人的是其中的一张照片,双手展开成花的形状置于肩膀的两旁,嘴角微微笑,公园里的背景.有绿色的树,有红色的花, 再加上这么一位清新秀丽的美女,特别

1006 小明与隔壁老王之间不得不说的故事

1006: 小明与隔壁老王之间不得不说的故事 时间限制: 1 Sec  内存限制: 128 MB提交: 355  解决: 152[提交][状态][讨论版] 题目描述 有一天,小明想偷吃隔壁老王院子里苹果树上的苹果. 但是,老王家有一条哈士奇,每隔一定时间就会吼叫.准确的说,它会在一个时间点吼叫第一次,之后每隔一段时间吼叫两次,比如第一次吼叫是在 t 时刻,间隔为 s,则吼叫时间点为 t, t + s, t + s + 1, t + 2s, t + 2s + 1 等. 小明是个要面子的人,不想被这

小明的密码-初级DP解法

#include #include #include using namespace std; int visited[5][20][9009];// 访问情况 int dp[5][20][9009]; // M N num num即M-1位的数字 int num_2[7]= {2,3,5,7,11,13,17}; int num_3[9]= {2,3,5,7,11,13,17,19,23}; int num_4[11]= {2,3,5,7,11,13,17,19,23,29,31}; //存储

hdu4506 小明系列故事——师兄帮帮忙 (规律模拟+快速幂)

Problem Description http://acm.hdu.edu.cn/showproblem.php?pid=4506 小明自从告别了ACM/ICPC之后,就开始潜心研究数学问题了,一则可以为接下来的考研做准备,再者可以借此机会帮助一些同学,尤其是漂亮的师妹.这不,班里唯一的女生又拿一道数学题来请教小明,小明当然很高兴的就接受了.不过等他仔细读题以后,发现自己也不会做,这下小明囧了:如果回复说自己不懂,岂不是很没面子? 所以,他现在私下求你帮忙解决这道题目,题目是这样的: 给你n个

擅长排列的小明(南阳19)(DFS)

擅长排列的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 小明十分聪明,而且十分擅长排列计算.比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想为难他,在这5个数字中选出几个数字让他继续全排列,那么你就错了,他同样的很擅长.现在需要你写一个程序来验证擅长排列的小明到底对不对. 输入 第一行输入整数N(1<N<10)表示多少组测试数据, 每组测试数据第一行两个整数 n m (1<n<9,0<m<=n) 输出 在1-n中选

一个算法题,又是小明。囧

第一次写博客文章,有点小紧张.若是有什么错误还望众大神指点.为了备战下个月的蓝桥杯,苦战算法题,觉得有一道题不错,就拿来分享一下. 原文如下:地宫取宝,X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签.地宫的入口在左上角,出口在右下角.小明被带到地宫的入口,国王要求他只能向右或向下行走.走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿).当小明走到出口时,如果他手中的宝贝恰好是k件,则这些宝贝就可

hunnu11544:小明的烦恼——找字符串

Problem description   小明是个很优秀的同学,他除了特别公正外,他也很细心,当然老师肯定也知道,这不,老师又有事情找他帮忙了,老师每周都会给他一个字符串A,然后问小明"A字符串的循环移位产生的所有字符串中,字典序最小的是哪个",于是小明屁颠屁颠的一个一个比对,但是长久下来,小明实在是受不了了,所以他想请你帮帮他.同样,你帮他解决,你就会多AC一个题目. Hint: 如果A字符串为bcda,那么其所有的循环移位的新字符串有cdab,dabc,abcd,和他自己bcda

第一次约会如何选酒?

第一次约会,不管是在酒吧选择鸡尾酒,还是去餐厅点葡萄酒,甚至自带酒水,都可以是建立第一印象的重要途径.如果你选的酒合适的话,既能让对方觉得你很有品味,又能增加不少话题.所以,这是我给出的约会时的选酒攻略: 我有个哥们曾经在网上遇到个蛮酷的女生,两人聊的投缘,一来二去,还约着线下见面.他是个典型的运动男,下班后去球场的次数恐怕要比去酒吧多两位数:就算去酒吧也是和同事一起去体育酒吧点啤酒看球.但对方姑娘,我都说了蛮酷的,上来就选了家上海挺出名的夜场酒吧. 我朋友倒也知道小心,毕竟酒托什么的新闻里也听

hunnu 小明的烦恼——找字符串

http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11544&courseid=0 小明的烦恼——找字符串 Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:32768KB Total submit users: 108, Accepted users: 68 Problem 11544 : No special judgement Probl