VBA – 一段 Excel 自动汇总代码

将此代码保存到模板文件里,将待汇总文件全部放入一个文件夹中。

此代码将从模板文件的第3个Sheet开始,根据Sheet名字,汇总目标文件夹中所有.xls文件的对应Sheet。

Sub 按文件夹汇总()
    ' 定义变量
    Dim folderDlg, folder$, file$
    Dim ignoreFilter As VbMsgBoxResult, deleteBlankRow As VbMsgBoxResult
    Dim sourceWB As Workbook, sourceWS As Worksheet
    Dim targetWS As Worksheet
    
    ' 选择文件夹
    Set folderDlg = Application.FileDialog(msoFileDialogFolderPicker)
    With folderDlg
        .Title = "请选择文件夹"
        .InitialFileName = ThisWorkbook.Path
        .AllowMultiSelect = False
    End With
    If folderDlg.Show Then
        folder = folderDlg.SelectedItems(1) & "\"
    Else
        MsgBox ("未选择文件夹,汇总已取消!")
        Exit Sub
    End If
    
    ' 自定义汇总设置
    ignoreFilter = MsgBox("是否取消筛选(复制隐藏单元格)?", vbYesNo, "筛选")
    
    ' 遍历文件夹下所有文件
    file = Dir(folder & "*.xls")
    Do While file <> ""
        ' 不打开同名文件
        If file <> ThisWorkbook.Name Then
            Set sourceWB = CreateObject(folder & file)
            ' 汇总每个子表格内容
            For i = 3 To ThisWorkbook.Worksheets.Count
                Set targetWS = ThisWorkbook.Sheets(i)
                Set sourceWS = sourceWB.Sheets(targetWS.Name)
                If sourceWS.UsedRange.Rows.Count > 6 Then
                    ' 取消筛选判断
                    If ignoreFilter = vbYes Then
                        sourceWS.AutoFilterMode = False
                        If sourceWS.FilterMode Then
                            sourceWS.ShowAllData
                        End If
                    End If
                    sourceWS.Rows(6 & ":" & sourceWS.UsedRange.Rows.Count).Copy
                    targetWS.Range("A" & targetWS.UsedRange.Rows.Count + 1).PasteSpecial (xlPasteValues)
                End If
            Next i
            Application.CutCopyMode = False
            sourceWB.Close (False)
        End If
        file = Dir
    Loop
    
    ' 删除空白行
    deleteBlankRow = MsgBox("汇总完成!是否删除空白行(建议删除)?", vbYesNo, "删除空白行")
    If deleteBlankRow = vbYes Then
        For s = 3 To ThisWorkbook.Worksheets.Count
            Set targetWS = ThisWorkbook.Sheets(s)
            For r = targetWS.UsedRange.Rows.Count To 6 Step -1
                If WorksheetFunction.CountA(targetWS.Rows(r)) = 0 Then
                    targetWS.Rows(r).Delete
                End If
            Next r
        Next s
    End If
End Sub

OpenWrt – 编译固件前个性化设置的几个文件路径

本文中路径以15.05.1为基础

./feeds/luci/modules/luci-base/root/etc/config/luci – LUCI 默认配置文件 (默认语言 等设置)

./packages/kernel/mac80211/files/lib/wifi/mac80211.sh – 无线网设置脚本 (默认开启Wi-Fi / Wi-Fi名后缀为MAC后6位 等设置)

./target/linux/ar71xx/image/Makefile – ar71xx 平台固件编译文件 (固件大小定义 等设置)

./tools/firmware-utils/src/mktplinkfw.c – TP-LINK 路由固件源文件1 (硬件Flash定义 等设置)

VS2010 – 根据DLL文件重建LIB文件

一般要在项目中调用第三方提供的库时,需要链接至第三方提供的DLL文件调用里面的函数,但是一般情况下我们能获取的只有头文件(.h)和动态链接库文件(.dll),而无法得到库文件(.lib),这对我们引用DLL造成很大不便:

如果想要调用DLL中的函数,单靠头文件(.h)和动态链接库文件(.dll)需要使用LoadLibrary()和FreeLibrary()加载DLL文件,并对每个函数都进行类型定义,并用GetProcAddress()对每个函数进行一一映射,在DLL中函数数量极多时,会明显增加工作量。

经过一番搜索和实践,今天终于根据DLL文件重建了LIB文件,大体步骤如下: 继续阅读

WOL – 华硕B85M系列主板的网络唤醒(Wake On LAN)设置

今天非常纳闷,在华硕B85M-E R2.0的BIOS设置里死活找不到网络唤醒(Wake On Lan)的设置,最后在华硕的英文支持论坛的这篇帖子里找到了解决方法:

在BIOS设置的【高级】→【高级电源管理(APM)】中开启【由 PCIE 设备唤醒】;
对应英文设置路径是”Advanced”-“APM”-“Power On By PCIE” set to “Enabled”。

我觉得这里的PCIE应该是PCI-Ethernet指而不是PCI-Express。不得不说华硕BIOS的这一处选项更改真的让人无奈。

CC2530 – IO端口

注明

  • 本文摘译自TI(德州仪器)公司的《CC253x System-on-Chip Solution for 2.4-GHz IEEE 802.15.4 and ZigBee® Applications User’s Guide》。
  • 文件号:SWRU191F。
  • 所有版权归TI(德州仪器)公司所有。
  • 本文章节序号与原文相同。

7. 输入/输出端口

数字I/O针脚共有21个,可以设定为通用数字I/O或者是连接到ADC、定时器、USART等外围设备信号的外围设备I/O。这些I/O端口的使用均可由用户通过对寄存器的设置实现。
I/O端口主要有以下几个特征:

  • 共21个数字I/O针脚
  • 通用数字I/O或外围设备I/O模式
  • 上拉/下拉(高/低电平)输入方式
  • 外部中断功能

所有I/O针脚都有外部中断功能,因此外部设备可以在必要时产生中断。这一特征也可以用于将本芯片从睡眠模式中唤醒(PM1,PM2,PM3电源模式)。 继续阅读

多级分光PON网络规划算法

注:本文摘自人民邮电出版社《光网络规划与优化(黄善国&张杰&韩大海&罗沛&张治国&郭秉礼)》,ISBN 978-7-115-25797-0。部分有所改动,仅学习交流用,请支持正版书籍。

(1)多级多PON(MHMP)算法的提出

PON网络规划成本主要有两部分构成:光纤成本和设备成本。其中光纤成本包括光纤的购买成本和敷设光纤的人力成本,而光纤成本在总成本中占有相当一部分比重,因此降低光纤成本是节约PON网络总体部署成本的关键。下述介绍可降低光纤成本从而降低总成本的多级多PON的方法。

下图为一个MHMP网络规划的实例(考虑了光纤沿道路方向敷设的因素),OLT位于中心局(CO),ONU分布在由用户确定的建筑内或者家庭内。OBD的位置是通过规划来确定的。通常,规划者首先调查规划地的实际地理条件,选择一些位置作为可选的OBD位置。规划问题转化为可选OBD位置中选择最适合的地点安装OBD,从而达到总体部署成本最低的目标。 继续阅读

OpenWrt – serialoverip的自启动脚本

serialoverip功能与ser2net相似,都能实现IP端口与串口间的数据转发,但不同点在于:

1. 官方发布的ser2net只支持TCP协议转发,增加UDP需要额外加补丁(详见:http://sourceforge.net/p/ser2net/patches/12/)。
2. serialoverip支持且只支持UDP协议转发,但也因此使得其程序非常小巧。后有我注释、替换变量名后的源代码,对此类软件的原理分析很有帮助。

在安装serialoverip后,尝试加入其启动命令到rc.local中,但发现开机并未成功启动serialoverip。几番分析,是由于执行rc.local中语句时OpenWrt的IP分配还未完成(即serialoverip无法绑定192.168.1.1端口),造成启动失败。

由于serialoverip源代码对此情况没有做考虑,所以笔者决定使用sleep来固定等待,修改了rc.local中命令:

sleep 10s && serialoverip -s 192.168.1.1 10002 -d /dev/ttyATH0 9600-8N1 &

先等待10秒再打开192.168.1.1:10002上UDP端口与/dev/ttyATH0串口的转发(加&让其后台运行)。

上例方法基本解决了serialoverip无法启动的问题,但是灵活性还是较低。苦苦搜索了sh命令规范后,本吊探索出一个更灵活的脚本(由于Linux虚拟机没装输入法,所以用英文注解了): 继续阅读

OpenWrt – 编译前的./scripts/feeds脚本用法

从OpenWrt获取源码(详见https://dev.openwrt.org/wiki/GetSource)后,直接使用make menuconfig来设置编译参数的时候是没有Luci和一些其他包的。

此时我们需要使用源代码里script文件夹下的feeds脚本来更新包列表,并将其集成到menuconfig中(假定现在的位置是OpenWrt源代码目录里):

更新包列表:./scripts/feeds update -a
集成到menuconfig:./scripts/feeds install -a

此外可以直接输入./scripts/feeds查看其用法,下面简略翻译了一下用法(水平有限,若有错误欢迎指正): 继续阅读

NetBeans – 2 字节的 UTF-8 序列的字节 2 无效

今天初学Java,于是用NetBeans创建了一个安卓工程,结果一开始就遇见两个问题:

1. MainActivity.java里提示程序包R不存在import android.R;后又变成R.layout里找不到符号main。

针对问题1,转到项目里,右键选择构建把项目先构建一遍就行了。

2. 在NetBeans打开build.xml时提示2 字节的 UTF-8 序列的字节 2 无效

针对问题2,搜索一番以后,解决方案如下(不一定适用于你):
2.1 用记事本打开build.xml,确认里面的encoding设置为UTF-8,如果已经是则直接下一步。
2.2 选择文件另存为,在保存文件窗口里把文件编码由ANSI(或其他非UTF-8)改为UTF-8

当然如果以上方法无法解决你的问题,建议bing或者google英文错误提示,获得更多解决方法。