一、数组
1.基础
arr = Range("A1:C3") '写入数组
arr = JJ.Sheets(1).[A4].Resize(JR, JC + 1) '写入数组
X = UBound(arr, 2) '数组维可用的最大下标(横向)
X = LBound(arr, 2) '数组维可用的最大上标(横向)
X1 = UBound(arr) '数组维可用的最大下标
X1 = LBound(arr) '数组维可用的最大上标
Dim arr1(1 To 10000, 1 To 4) '创建数组
'数组写入指定单元格
'(S 表示新区域中的行数、4 新区域中的列数)
Range("E4").Resize(S, 4) = arr1
'将一行单元格区域转置成一列单元格区域
Range("a2").Resize(5, 1) = Application.Transpose(Arr)
2.重新定义数组大小
Sub 重新定义数组大小()
Dim arr()
arr = Range("a1:b5")
ReDim arr(1 To 2, 1 To 1) '不保留原数据
ReDim preserve arr(1 To 10, 1 To 1) '保留原数据
End Sub
3.按指定分隔符拆分
Sub 连接某个数组中的多个子字符串b() '列
'多列的单元格写入数组,转置成一维
arr = Range("A1:d8")
arr1 = Application.Transpose(Application.Index(arr, , 2)) '取arr第2列数据并转置成1维数组
MsgBox Join(arr1, ",")
End Sub
4.用指定分隔符连接
Sub 连接某个数组中的多个子字符串b() '列
'多列的单元格写入数组,转置成一维
arr = Range("A1:d8")
arr1 = Application.Transpose(Application.Index(arr, , 2)) '取arr第2列数据并转置成1维数组
MsgBox Join(arr1, ",")
End Sub
5.连接数组中的多个字符
Sub 连接某个数组中的多个子字符串b() '列
'多列的单元格写入数组,转置成一维
arr = Range("A1:d8")
arr1 = Application.Transpose(Application.Index(arr, , 2)) '取arr第2列数据并转置成1维数组
MsgBox Join(arr1, ",")
End Sub
二、字典
1.取不为空的值写入字典
代码如下(示例):
BARR = [I1:I1000]
Set dict = CreateObject("Scripting.Dictionary")
For yi = 1 To UBound(BARR) Step 1
If BARR(yi, 1) <> "" Then
dict(CStr(BARR(yi, 1))) = dict(CStr(BARR(yi, 1)))
End If
Next
2.查找标题栏位置
代码如下(示例):
Sub 查找标题栏位置()
arr = Range("A1:D7226")
Dim h
Set h = CreateObject("scripting.dictionary")
For B = 1 To UBound(arr, 2) Step 1
h(arr(1, B)) = B
Next
K = h("2022-12")
End Sub
3.写入字典
代码如下(示例):
Set H1 = CreateObject("scripting.dictionary")
For X = 1 To UBound(BARR) Step 1
SR = BARR(X, 1)
For Z = 2 To UBound(arr) Step 1
SS = arr(Z, K1) '品号
ST = arr(Z, K6) '批号
SM = arr(Z, K7) '数量
SN = arr(Z, K5) '仓库
SB = arr(Z, K6) '批号
SO = SS & ";" & ST
If SR = SS Then
If Not H1.Exists(SO) Then
H1.Add SO, SS & ";" & -SM & ";" & SN & ";" & SB
End If
End If
Next Z
Next X
key_D2 = H1.Keys 'key值
item_D2 = H1.items 'item值
Sub 字典()
ARR = Range("A2:D5")
Dim h
Set h = CreateObject("scripting.dictionary")
Dim arr1(1 To 10000, 1 To 4)
Dim 行, 列
Dim z, s
For z = 1 To UBound(ARR)
sr = ARR(z, 1) & ";" & ARR(z, 3) & ";" & ARR(z, 4)
h(sr) = h(sr) + ARR(z, 2) '写入字典 h(sr)为key值,ARR(z,2)为item值
Next z
key_H = h.keys 'key值
item_H = h.items 'item值
For F = 0 To UBound(key_H)
TA = Split(key_H(F), ";") '拆分
Cells(F + 1, 1) = TA(0) '将key值写入表格
Cells(F + 1, 2) = TA(1)
Cells(F + 1, 3) = TA(2)
Cells(F + 1, 4) = item_H(F) '将item值写入表格
Next
End Sub
4.拆分字典
代码如下(示例):
If H1.Exists(AB) Then
TA = Split(H1(AB), ";") '拆分
TextBox2.text = TA(0)
TextBox3.text = TA(1)
TextBox4.text = TA(2)
End If
5.匹配key值写入item值
代码如下(示例):
For P = 2 To UBound(arr) Step 1
CS = WorksheetFunction.Clean(arr(P, Y + 1))
If H2.Exists(CS) Then
arr(P, Y + 3) = H2(CS) 'item值
End If
Next
6.透视表
代码如下(示例):
Sub 透视表()
ARR = Range("a3:o351")
Dim h
Set h = CreateObject("scripting.dictionary")
Dim arr1(1 To 10000, 1 To 4)
Dim 行, 列
Dim z, s
For z = 1 To UBound(ARR)
sr = ARR(z, 4) & "-" & ARR(z, 5) & "-" & ARR(z, 8) '
If h.Exists(sr) Then
行 = h(sr)
arr1(行, 4) = arr1(行, 4) + ARR(z, 10)
Else
s = s + 1
h(sr) = s
arr1(s, 1) = ARR(z, 5)
arr1(s, 2) = ARR(z, 4)
arr1(s, 3) = ARR(z, 8)
arr1(s, 4) = ARR(z, 10)
End If
Next z
Range("E1").Resize(s, 4) = arr1
End Sub
7.比较两个字典的大小
代码如下(示例):
Set BB = Workbooks(ThisWorkbook.Name)
Set B1 = Workbooks.Open(BB.Sheets(1).[A2])
H2 = B1.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
ARR = B1.Sheets(1).[E9].Resize(H2, 8)
Set dict = CreateObject("scripting.dictionary")
For Z = 1 To UBound(ARR) - 9 Step 1
SO = ARR(Z, 1) & ";" & ARR(Z, 2)
If dict.Exists(SO) Then
dict(SO) = dict(SO) + ARR(Z, 8)
Else
dict.Add SO, ARR(Z, 8)
End If
Next Z
key_D1 = dict.Keys 'key值
item_D1 = dict.items 'item值
Set B2 = Workbooks.Open(BB.Sheets(1).[A3])
H3 = B2.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
ARR1 = B2.Sheets(1).[A2].Resize(H3, 5)
Set dict1 = CreateObject("scripting.dictionary")
For Z1 = 1 To UBound(ARR1) Step 1
SO1 = ARR1(Z1, 1) & ";" & Left(ARR1(Z1, 4), 13)
If dict1.Exists(SO1) Then
dict1(SO1) = dict1(SO1) + ARR1(Z1, 5)
Else
dict1.Add SO1, ARR1(Z1, 5)
End If
Next Z1
key_D2 = dict1.Keys 'key值
item_D2 = dict1.items 'item值
'遍历第一个字典的键,匹配两个字典中具有相同键的项,并比较它们的项值的大小
For Each Key In dict.Keys
'检查第二个字典是否包含相同的键
If dict1.Exists(Key) Then
'如果存在,比较项值大小
If dict(Key) > dict1(Key) Then
Debug.Print "键 " & Key & " 的项值较大:" & dict(Key) - dict1(Key)
ElseIf dict(Key) < dict1(Key) Then
Debug.Print "键 " & Key & " 的项值较小:" & dict1(Key)
Else
Debug.Print "键 " & Key & " 的项值相同:" & dict(Key)
End If
Else
Debug.Print "第二个字典不包含键:" & Key
End If
Next Key
8.改变字典中的值
代码如下(示例):
i = 1 ' 从第一行开始写入
For Each Key In H2.Keys
Cells(i, 1).Value = Key ' 将键写入A列
Cells(i, 2).Value = H2(Key) ' 将值写入B列
i = i + 1 ' 移动到下一行
Next Key
三、设置单元格
Selection.Borders.LineStyle = 1 '加边框 1表示实线
Selection.Borders(12).Weight = 1 '选择区域内的边框(不包括四周),(12)表示区域内水平边框,(11)表示区域内垂直边框
Selection.Interior.ColorIndex = 37 '单元格加颜色
Cells(AQ, 8).Interior.Color = RGB(255, 192, 0)
RGBValue = RGB(192, 192, 192) '求RGB单元格加颜色
Cells(2, 2).Interior.Color = RGBValue
A = Range("A65").DisplayFormat.Interior.Color '求单元格加颜色
Cells(F1, 9).Font.ColorIndex = 3 '字体加颜色
Cells.WrapText = False '取消自动换行
ActiveWindow.DisplayGridlines = True '显示网格线
Columns("M:O").Hidden = True ' 隐藏列
Columns("B:B").SpecialCells(xlCellTypeBlanks).EntireRow.Delete '删除空值行
Cells.EntireColumn.AutoFit '自动调整列宽
Cells.EntireRow.AutoFit '自动调整行宽
Cells.NumberFormatLocal = "#,##0.000_ " '设置保留3位小数
Selection.NumberFormatLocal = "_ * #,##0_ ;_ * -#,##0_ ;_ * ""-""_ ;_ @_ " '设置会计专用
Rows(3).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove'插入一行
Cells.Replace What:="J2025", Replacement:="JDM", LookAt:=xlPart'替换
Range("A5:E13").ClearContents ' 清除内容
Selection.PasteSpecial Paste:=xlPasteValues ' 粘贴成数值
Sub 宏1()
With Selection
.HorizontalAlignment = xlCenter ' 居中
.HorizontalAlignment = xlDistributed ' 字符分散对齐
.HorizontalAlignment = xlJustify '调节对齐
.HorizontalAlignment = xlLeft ' 靠左
.HorizontalAlignment = xlRight ' 靠右
End With
End Sub
▲▼
Sub 调色板()
For A = 0 To 56
Range("A" & A + 1).Interior.ColorIndex = A
Next
End Sub
Sub 冻结窗口()
Range("B4").Select
ActiveWindow.FreezePanes = True '冻结窗口
ActiveWindow.FreezePanes = False '取消冻结窗口
End Sub
' WPS冻结窗格
ActiveSheet.Select
' 冻结首行(第1行)
With ActiveWindow
.SplitRow = 1
.FreezePanes = True
End With
'设置单元格_字体
With Selection.Font '包含对象的字体属性(字体名称、字号、颜色等等)
.Name = "宋体" '字体
.FontStyle = "常规" '字型(倾斜、加粗)
.Size = 11 '字号
.Strikethrough = False '删除线(属性值 False True)
.Superscript = False '上标(属性值 False True)
.Subscript = False '下标(属性值 False True)
.Underline = xlUnderlineStyleNone '设置下划线
.Color = 255 '字体颜色
End With
'设置单元格_对齐
With Selection
.HorizontalAlignment = xlGeneral '水平对齐方式
.VerticalAlignment = xlCenter '垂直对齐方式
.WrapText = True '自动换行(属性值 False True)
.Orientation = 0 '字体角度
End With
'设置单元格_数字
With Selection
.NumberFormatLocal = "0.00_ "'常规
.NumberFormatLocal = "G/通用格式"
End With
'设置单元格_边框&填充
With Selection
.Borders.LineStyle = 1 '加边框 1表示实线
'选择区域内的边框(不包括四周),(12)表示区域内水平边框,(11)表示区域内垂直边框
.Borders(12).Weight = 1 '虚线
.Interior.ColorIndex = 37 '单元格加颜色
End With
With Cells
'取消自动换行
.WrapText = False
'取消合并单元格
.UnMerge
End With
四、特殊单元格
非空单元格的最大列/行号
A0 = Cells(3, Columns.Count).End(xlToLeft).Column
B0 = Cells(Rows.Count, A2).End(xlUp).Row