VBA之遍历代码

通过使用条件语句和循环语句 (也称为控制结构), 可以编写做出决策和重复操作的 Visual Basic 代码。 另一个有用的控制结构是With 语句, 它允许您运行一系列语句, 而无需重新限定对象。

条件语句

  • If…Then…Else:当条件为 True 或 False 时执行分支语句
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function Bonus(performance, salary) 
    If performance = 1 Then
    Bonus = salary * 0.1
    ElseIf performance = 2 Then
    Bonus = salary * 0.09
    ElseIf performance = 3 Then
    Bonus = salary * 0.07
    Else
    Bonus = 0
    End If
    End Function
  • Select Case:从一组条件中选择一个分支
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function Bonus(performance, salary) 
    Select Case performance
    Case 1
    Bonus = salary * 0.1
    Case 2, 3
    Bonus = salary * 0.09
    Case 4 To 6
    Bonus = salary * 0.07
    Case Is > 8
    Bonus = 100
    Case Else
    Bonus = 0
    End Select
    End Function

循环重复代码

  • Do…Loop:当条件为 True 时开始循环或停止循环
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub ExitExample() 
    counter = 0
    myNum = 9
    Do Until myNum = 10
    myNum = myNum - 1
    counter = counter + 1
    If myNum < 10 Then Exit Do
    Loop
    MsgBox "The loop made " & counter & " repetitions."
    End Sub
  • For…Next:使用计数器按指定次数运行语句
    1
    2
    3
    4
    5
    6
    Sub TwosTotal() 
    For j = 2 To 10 Step 2
    total = total + j
    Next j
    MsgBox "The total is " & total
    End Sub
  • For Each…Next:对集合中的每个项目重复运行一组语句
    1
    2
    3
    4
    Dim TestArray(10) As Integer, I As Variant 
    For Each I In TestArray
    TestArray(I) = I
    Next I

    对同一对象运行多个语句

  • With:对同一对象运行一系列语句

Exit 语句

退出 Do…Loop 块、 For…Next 、 Function 、 Sub 或 Property 代码

  • Exit Do
  • Exit For
  • Exit Function
  • Exit Property
  • Exit Sub

VBA之数据类型

数据类型是变量的特征,它决定了变量可以包含哪种数据。 数据类型包括下表中的类型以及用户定义类型和特定的对象类型

常用内置数据类型

  • Boolean
  • Date
  • Decimal
  • Double
  • Integer
  • Object
  • String
  • Variant

类型转化

  • CBool
  • CDate
  • CInt

验证数据类型

  • IsArray
  • IsDate
  • IsEmpty
  • IsError
  • IsMissing
  • IsNull
  • IsNumeric
  • IsObject

引用

数据类型摘要

洗脸巾

虽然它长的其貌不扬,但是,内容物真心好用呀!推荐给大家!!

✤外包装设计比较占空间,最里面是手卷纸的设计,外层一个保护套,打开里面的包装之后可以这样子拉出来。

✤洗脸巾很厚,真的特别的厚实,大小的话跟winnet的棉柔巾差不多,大一丢丢,但是厚度至少是它的3倍吧!

✤表面是带压纹的,如果是洗脸的话可以增加一点摩擦感,而我也真的非常喜欢把它拿来洗脸,特别是拿来洗涂抹式面膜,简直不要太赞了!

敏感肌在换季时真是如临大敌,连洗脸这样简单的日常清洁也要多加注意.

🧖🏻‍♀️ 夏天常用的棉纱巾,到了冬天稍嫌刮脸;一次性洗脸巾蘸水后变得柔软无比,而且没有棉屑残留,最适合容易过敏泛红的脆弱皮肤了~

🧖🏻‍♀️ 可能因为是美容院专用版,ITO这款洗脸巾做的比很多抽取式洗脸巾更厚实更大张,湿水后也更柔韧.

喜欢这款洗脸巾还有一个原因,就是没什么添加的味道,只是淡淡的纸浆味,感觉比较天然一些.

🧖🏻‍♀️ 买之前看到有人说用来卸妆也很好使,不过个人感觉这款洗脸巾吸水力好强噢,用来卸妆超级费卸妆液的

倒是个洗涂抹式面膜的好帮手,湿水不破,轻擦不磨脸不起毛,太棒了🏻

不过呢,一次性洗脸巾其实挺浪费的,不太环保.

好在很耐用,洗完脸还能用来擦擦洗手台和镜子,算是减轻自己多制造了垃圾的罪恶感啦~

简柔·压缩棉柔巾 呵护无微不至旅行必备!

纸质柔软细腻 独立包装 干净卫生 遇水瞬间膨胀

这款洗脸巾已经回购无数次了 每次都是十盒八盒的买了托人带出来 超好用 我家浴室台面专门搁了一个小篮子用来放洗脸巾 小孩子每天早上每人一颗洗脸擦手 用完放洗手台边上 二次利用 我用来擦台面水渍 做卫生 连抹布都省了超级适合懒人如我……

好物不闲置

购于大宝

又是一个“空袋记”,用空了一包棉森100%纯棉洗脸巾100张,每天用2-3片,用了将近两个月,抽取式设计,很方便很耐用!

几年前我就再也不用毛巾擦脸了,一是因为毛巾容易滋生细菌,对痘痘肌和敏感肌简直恐怖!二是因为毛巾需要反复清洁很麻烦,洗的不干净或者有洗剂残留对皮肤都有损害。

我在君君的晒货区看过小伙伴们晒货在Target就能买到的洗脸巾。我也买了用了用,说实话没办法跟国内和日本的质量相提并论。纸质非常粗糙,在脸上会掉屑,我自己用不来。

天猫上比较出名的洗脸巾就是棉森和纯棉时代,相比于纯棉时代的包装,棉森更小清新更可爱,使用感很舒服不刺激皮肤,一片不大不小正好够我擦脸,所以一直回购了~

每次有活动的时候,平均下来一包只要十多块人民币,性价比实在是很高,建议大家在双十一,双十二,518和女王节的时候多多关注!当然平时买也就二十多块人民币,总之就是便宜~

读《孙正义传》之平台商

一般来说,每一个人的成功都是不可复制。
不可复制的原因太多:

  • 历史背景的因素(时势造英雄)
  • 个人天赋的因素(爱因斯坦智商160-190之间)
  • 家庭背景的因素
  • 。。。

不过,这并不意味着我们可以不学习前人的经验教训。俗话说,站在巨人的肩膀上,能让我们看得更远,少走很多弯路。

当下2021年,越来越多的人从事副业,拓展收入来源。更多的人开启创业,希望实现财富自由。不管是已经身处创业的浪潮,或者是
在创业边缘跃跃一试,随时冲入。都不防看看前人成功的经验教训。

创业是为了创造营收,而营收由单件利润*销售数量决定。而怎么样才能实现单价利润最大,销售数量最大。

这边不得不说说孙正义先生平台商的概念(简单粗暴的理解成垄断)。

平台商,既确保了定价权,又确保了销售量。

引用原文中的故事:

川边:雅虎美食是万年老三,怎么也赶不上tabelog 和GURUNVAI.可能还得收购它们其中一个。
孙正义:你会不会打牌?
川边:啊?算会把,怎么了?
孙正义:你看啊,扑克也是这样。四张比两对更厉害,没错吧。这样就肯定能赢吧。
川边:那倒是没错。。。。
孙正义:所以,这种时候不是要收购它们当中一个,而是要两个都收购。从一开始就应该考虑,要怎么做才能实现这个目标。

构建垄断体,商业模式才能实现像二级函数曲线那样的增长。
形成行业壁垒,行业壁垒越高,竞争对手越少,利润的想象空间越大。

举例来说一个最直观的情况,最近异常火热的共享单车涨价事件和共享充电宝涨价事件。

相信经历过共享单车和充电宝大战的都知道,从最开始的免费骑,到后面的买月卡,再到现在一再提高每小时的单价。在血拼构建平台商时,都是白刀子进,红刀子出,撒的都是钱;在如今平台商地位稳固,也就露出来平台商的优势,绝对的定价权。在干掉了大部分平台,确保了头部地位,行业壁垒已经产生,这种情况下,已经没了外部玩家可以插足的地盘,价格可以一提再提。

在我们开始一项事业时,不妨想想,这个事业的行业壁垒在哪里,该如果构建平台商。在没有大资本做背书的情况下,行业壁垒的高低,决定了能走多远,能走多高。一旦行业壁垒实现,利润的空间是不可想象的。

Hexo通过Github Actions自动部署到Github Pages

当我们开发属于自己的博客时,一般来说,可以通过现有Blog框架如Hexo来实现Blog模板,然后文件资源存储在Github仓库中,最后通过Github Pages来实现Host,给外部访问。

下面来看看详细的实现步骤。

初始化Hexo项目

关于Hexo框架使用,可以参考Hexo入门

配置Github Actions

在通过Github实现部署的时候,建议是使用同一个仓库的两个分支,一个用于存储代码,一个用于部署生成后的文件
测试案例使用以下两个分支:

  • main (Github目前默认的主分支)
  • show (自建的新分支用于保存发布后的文件和配置Github pages)

创建Github Actions

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
name: Auto Deploy

on:
push:
branches:
- main

jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup Node
uses: actions/setup-node@v1
with:
node-version: '10.x'

- run: npm install --no-optional
- run: npx hexo generate --deploy

- name: Deploy
uses: peaceiris/actions-gh-pages@v3
with:
repository: Edward-Zhou/Meekou.Blog #更换为自己的Github仓库地址
publish_branch: show #用于保存发布后文件的分支
github_token: ${{ secrets.GITHUB_TOKEN }} #secrets.GITHUB_TOKEN是Gtihub仓库自带的环境变量
publish_dir: ./public #Hexo默认部署生成的文件
cname: blog.meekou.cn # 用于配置Github Pages的Domain

FAQ

  • This version of npm is compatible with lockfileVersion@1, but package-lock.json was generated for lockfileVersion@2
    这是package-lock.json版本不匹配的错误,可以尝试以下几种方式
    • 使用npm install --no-optional
    • package-lock.json添加到.gitignore,并从项目里删除package-lock.json

参考文献

hexo-deployer-git

Excel实现字符串日期相加

关于在Excel中实现两个时间字符串相加,比如4天21小时0分钟+1天3小时1分钟=6天0小时1分钟.

主要思路:

  • 将字符串日期转化为分钟
  • 将分钟相加
  • 将总分钟转化为时间字符串

具体实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Function SumDay(rng As Range)
Dim mins As Integer
mins = 0
For Each r In rng
mins = mins + ConvertDayToMin(r.Value)
Next r
SumDay = ConvertMinToDay(mins)
End Function
Function ConvertDayToMin(day As String)
dd = Mid(day, 1, InStr(1, day, "天") - 1)
hh = Mid(day, InStr(1, day, "天") + 1, InStr(1, day, "小时") - InStr(1, day, "天") - 1)
mm = Mid(day, InStr(1, day, "小时") + 2, InStr(1, day, "分钟") - InStr(1, day, "小时") - 2)
ConvertDayToMin = dd * 24 * 60 + hh * 60 + mm
End Function
Function ConvertMinToDay(mins As Integer)
dd = mins \ (24 * 60)
hh = (mins - dd * 24 * 60) \ 60
mm = (mins - dd * 24 * 60 - hh * 60)
ConvertMinToDay = dd & "天" & hh & "小时" & mm & "分钟"
End Function

Airtest从PC传输文件到手机

如何实现自动将文件从PC端传输到手机端?关于传统的文件操作是没有办法实现的,这主要是因为手机连接用的不是文件系统。
如果我们从PC端查看文件路径,文件夹路径显示的是This PC这种是不被文件类库识别的。
一般来说,我们可以通过adb来实现,在使用adb中最常见的问题,就是

  • 原始文件不存在
    • 检查文件路径,如果路径存在空格,用r加前缀(针对于Airtest)
  • 目标文件不存在
    • 手机端初始路径是/storage/sdcard0,后续再接真实路径
  • 操作执行完成后文件在手机端不显示
    • 需求通过broadcast来刷新文件
  • 文件传输成功,也刷新了,但是文件在手机显示的不是最新的
    • 有可能是复制替换的同一文件名,试试在push到手机端时,如果是覆盖同一文件,建议修改文件名
    • 一般一段时间后会刷新,由手机系统控制,需要实时刷新,建议用步鄹一

这里分享两种方式:

  • 一种是直接通过cmd来执行
    1
    2
    adb push 'file path in pc' '/storage/sdcard0/target path in phone'
    adb shell am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d 'file:///storage/sdcard0/target path in phone'
  • 另外一种是通过Airtest的Push
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # -*- encoding=utf8 -*-
    __author__ = "Edward"

    from airtest.core.api import *
    from airtest.core.android.android import *
    auto_setup(__file__)

    android = Android()

    baseFolder = r'C:/Users/Edward/System Folder/Desktop/苏宁/Auto/';
    targetFolder = r'/storage/sdcard0/00/';

    android.adb.push(baseFolder + group + '/' +filename,targetFolder + group + '/' +filename);
    android.adb.shell(r'am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file://' + targetFolder + group + '/' +filename);