Excel VBA对象模型分类列举

  • 单数通常是某个具体对象,复数大多是对象的集合(Ranges 本身不是集合,而是 Range 对象)。
  • 对象
    • 属性
    • 方法
    • 事件
  • 应用级别功能
    • Application:代表 Excel 应用程序。可以通过引用Application对象的属性返回不同的子对象。对于某些特殊的对象可以省略Application。
      • .ActiveCell:当前活动单元格
      • .ActiveChart:当前活动工作簿中的活动图表
      • .ActiveSheet:当前活动工作簿中的活动工作表
        • .ActiveSheet.UsedRange
      • .ActiveWindow:当前活动窗口
      • .ActiveWorkbook:当前活动工作簿
      • .Charts:当前活动工作簿中所有的图表工作表
      • .Selection:当前活动工作簿中所有选中的对象
      • .Sheets:当前活动工作簿中所有Sheet对象,包括普通工作表、图表工作表、Ms Excel 4.0宏表工作表和Ms Excel 5.0对话框工作表
      • .Worksheets:当前活动工作簿中的所有Worksheet对象(普通工作表)
      • .Workbooks:当前所有打开的工作簿
      • .Cells:活动工作表上的所有单元格。
      • .Columns:活动工作表上的所有列。
      • .Rows:代表活动工作表上的所有行。
      • .ScreenUpdating:是否将程序运行过程中的计算结果显示到屏幕上。
      • .DisplayAlerts:属性决定在程序运行中是否显示警告信息
      • .EnableEvents:属性来启用或禁用事件
      • .WorksheetFunction:属性调用部分工作表函数。
    • 枚举:有关 Excel 对象模型中的枚举
    • Watch(es):表示重新计算工作表时跟踪的区域。
  • 工作表工作簿对象
    • Sheets:指定的或活动工作簿中所有工作表的集合。
    • SheetViews:指定的或活动工作簿窗口中所有工作表视图的集合。
    • Workbook(s):代表工作簿。
    • Worksheet(s):代表工作表。
      • .UsedRange
    • WorksheetFunction:用作可从 Visual Basic 中调用的 Microsoft Excel 工作表函数的容器。
    • WorksheetView:定义单个工作表视图的行为的对象。
    • Window(s):代表一个窗口
    • PivotTable(s):代表工作表上的数据透视表。
  • 选区
    • Areas:由选定区域内的多个子区域或连续单元格块组成的集合。
    • Range(s):表示一个单元格、一行、一列、一个包含单个或若干连续单元格区域的选定单元格范围,或者一个三维区域。
    • ListObject(s):工作表中的一部分的表格区域(插入-表格)
    • ListColumn(s):代表表格中的一列。
    • ListRow(s):代表表格中的一行。
    • Name(s):命名区域,代表一个定义名称.
  • 样式
    • Style(s):代表区域的样式说明。
    • Font:包含对象的字体属性(字体名称、字号、颜色等等)。
    • FillFormat:代表形状的填充格式。
    • TableStyle(s):代表表格、数据透视表或切片器的一个或所有元素定义格式。
    • TableStyleElement(s):代表表格样式元素。
    • Comment(s):代表单元格批注。
  • 功能
    • AutoFilter:代表对指定工作表的自动筛选。
    • Filter(s):单数代表单个列的筛选。复数为自动筛选范围中的所有筛选器。
    • Sort:代表数据区域的排序方式。
    • SortField(s):包含 WorksheetListObject 和 AutoFilter 对象的所有排序信息。
    • Outline:代表工作表上的分级显示。
    • Top10:代表条件格式规则的前十项。
    • Validation:代表工作表区域的数据有效性规则。
    • UniqueValues: 提取数据列中唯一值。使用 DupeUnique 属性返回或设置一个枚举。
    • FormatCondition(s):表示组合框或文本框控件的条件格式
graph TD %% 定义样式 classDef root fill:#f9f,stroke:#333,stroke-width:4px; classDef collection fill:#e1f5fe,stroke:#01579b,stroke-width:2px; classDef object fill:#fff9c4,stroke:#fbc02d,stroke-width:2px; classDef active fill:#f3e5f5,stroke:#7b1fa2,stroke-dasharray: 5 5; classDef correct fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px; %% 根节点 App[Application]:::root %% === Application 一级对象 === App --> Wbs(Workbooks):::collection App --> AppNames(Names):::collection App --> AppWins(Windows):::collection App --> Watchs(Watches):::collection App --> RTD[RTD]:::object %% 全局快捷属性 App -.->|ActiveWorkbook| ActWb[ActiveWorkbook]:::active App -.->|ActiveSheet| ActWs[ActiveSheet]:::active App -.->|ActiveCell| ActCell[ActiveCell]:::active App -.->|Selection| Sel[Selection]:::active %% === Workbook 层级 === Wbs --> Wb[Workbook]:::object ActWb -.->|引用| Wb Wb --> Wss(Worksheets):::collection Wb --> Charts(Charts):::collection Wb --> Sheets(Sheets):::collection Wb --> WbNames(Names):::collection Wb --> Styles(Styles):::collection Wb --> WbWins(Windows):::collection %% XmlMaps 层级修正 Wb --> XmlMaps(XmlMaps):::collection XmlMaps --> XmlMap[XmlMap]:::object XmlMap --> XmlSchemas(XmlSchemas):::collection XmlSchemas --> XmlSchema[XmlSchema]:::object %% === Worksheet 层级 === Wss --> Ws[Worksheet]:::object ActWs -.->|引用| Ws %% Worksheet 的主要子对象 Ws --> Ranges(Range返回属性):::collection Ws --> ListObjs(ListObjects):::collection Ws --> PivotTables(PivotTables):::collection Ws --> AutoFilter[AutoFilter]:::object Ws --> WsSort[Sort]:::object Ws --> Outline[Outline]:::object Ws --> WsNames(Names):::collection Ws --> Comments(Comments):::collection %% Range 属性归属 Ranges --> CellRange[Cells/Rows/Columns]:::object CellRange --> RangeObj[Range]:::object ActCell -.->|引用| RangeObj %% === Range 层级 (核心修正) === RangeObj --> Areas(Areas):::collection RangeObj --> Font[Font]:::object RangeObj --> Interior[Interior]:::object RangeObj --> Validation[Validation]:::object RangeObj --> FormatConds(FormatConditions):::collection RangeObj --> RangeComment[Comment]:::object RangeObj --> XPath[XPath]:::object RangeObj --> ListObjRef[ListObject]:::object %% 注:Range 有 Sort 方法,但没有 Sort 对象属性 %% FormatConditions 展开 FormatConds --> FormatCond[FormatCondition]:::object FormatCond --> Top10[Top10]:::object FormatCond --> UniqueVals[UniqueValues]:::object %% === ListObject 层级 === ListObjs --> ListObj[ListObject]:::object ListObj --> ListCols(ListColumns):::collection ListObj --> ListRows(ListRows):::collection ListObj --> TableStyle[TableStyle]:::object ListObj --> LoSort[Sort]:::object ListCols --> ListCol[ListColumn]:::object ListRows --> ListRow[ListRow]:::object %% TableStyle 展开 TableStyle --> TableStyleElems(TableStyleElements):::collection TableStyleElems --> TableStyleElem[TableStyleElement]:::object %% === AutoFilter 层级 === AutoFilter --> Filters(Filters):::collection Filters --> Filter[Filter]:::object AutoFilter --> AfSort[Sort]:::object %% === Window 层级 === AppWins --> Win[Window]:::object WbWins --> Win Win --> SheetViews(SheetViews):::collection SheetViews --> WsView[WorksheetView]:::object

对于计算机而言,进行 1000 项更改与进行 10 项更改并无不同,因此这里对于较大的文档和问题而言就有了规模效应,而这正是 VBA 能够真正出彩和节省时间的原因。

事件过程:因为Workbook(工作簿)对象能识别Open(打开)这个动作,所以打开工作簿就会自动运行相应的程序。像这种当某个事件发生后自动运行的过程称为事件过程。事件过程也是Sub过程。事件过程必须写在特定对象所在的模块中,而且只有过程所在的模块里的对象才能触发这个事件。事件过程的过程名由Excel自动设置,以“对象名称_事件名称”的形式存在,不能更改。

Sub 是一种子过程,用于执行一系列操作,但不返回值。它通常用于完成任务。Function 的特点 Function 是一种函数过程,用于执行计算并返回一个值

适用于 Visual Basic for Applications (VBA) 的 Excel 对象模型 | Microsoft Learn

VBA 编程的第一个挑战是了解每个 Office 应用程序的对象模型以及阅读对象、方法和属性语法。


薛奔Excel课程 Excel函数
2022年06月16日 14:32


excel数据表可以插入切片器。这样能实现筛选器的单选功能。

excel的逆透视能够将二维表转为一维表。tomz笔记有一个不知道现在还能不能用的基于一维表的双链跳转程序。

用excel的旭日图能更高效的展示大纲。



#DIV/0!:公式被0除,分母为0。 
#NAME?:名称错误,函数名称写错了。 
#VALUE!:错误参数,数值与文本直接相加会出现这个错误。 
#REF!:引用错误。原先所引用的单元格消失了。(追踪引用单元格可以看到这个现象) #N/A:无可用数值,最常见于VLOOKUP时,不存在的值。
#NAME?和#VALUE!是一组对应函数的名称和参数。


	1. F9键可以把公式表达式一键转换为值
	2. 快速输入公式技巧:输入等号,可以使用按TAB键补全公式,然后可以使用鼠标选中单元格填充参数,最后可以按回车或者TAB键完成公式的输入。
	3. 编辑栏输入公式会比较好\(^o^)/~
	4. 公式前敲一个空格可以保留公式然后编辑其它单元格。



逻辑函数


if、and、or

IF 函数,英文状态的前后双引号。
	1. 函数判断得到结果,对结果进行标记。
	2. 条件格式设置条件规则,在规则中填写公式,对条件区域中符合条件的单元格进行标记。

isna、istext、isnumber、isnontext、islogical、isblank、iserr、iferror。

iserr()与isna()构成了错误的全部判断函数。

iferr():捕获错误并处理。


查找与引用函数

所谓的升序排列就是从小往大排,从1往n排。

Lookup:在一行或者一列中进行数据查询,Index Match横纵查询
LOOKUP有两种形式:向量形式和数组形式。
	- 向量形式: LOOKUP(lookup_value,lookup_vector,result_vector) ;
	- 数组形式: LOOKUP(lookup_value,array)。 
	
	array和lookup_vector的数据必须按升序排列,否则函数LOOKUP不能返回正确的结果。文本不区分大小写。

	1. 如果函数LOOKUP找不到lookup_value,则查找array和 lookup_vector中小于lookup_value的最大数值。
	2. 如果lookup_value小于array和 lookup_vector中的最小值,函数LOOKUP返回错误值#N/A。另外还要注意:函数LOOKUP在查找字符方面是不支持通配符的,但可以使用FIND函数的形式来代替。


关键的部分:如果函数LOOKUP找不到lookup_value,则查找array和 lookup_vector中小于lookup_value的最大数值。最大值就是查找区域的最后一列。


lookup逆序模糊匹配公式:=LOOKUP(1,0/(find(条件区域,条件),计算区域)) 条件区域相当于VLOOKUP中的参数二,条件相当于参数一,计算区域相当于参数三。



Vlookup最容易出错的地方是查找区域的首列必须含有查找的内容。
Vlookup:在参数二这个区域中,通过条件参数一与参数三,找到需要的结果。参数一作为唯一的ID


Index Match横纵查询
MATCH函数含义:返回指定数值在指定数组区域中的位置

match查找重复值,有重复的返回一个值,没有重复的返回N/A错误

MATCH函数是EXCEL主要的查找函数之一,该函数通常有以下几方面用途:(1)确定列表中中某个值的位置;(2)对某个输入值进行检验,确定这个值是否存在某个列表中;(3)判断某列表中是否存在重复数据;(4)定位某一列表中最后一个非空单元格的位置。


index:在一个区域中,指定行号与列号(数字)将会得到指定位置的单元格内容。或者说,获得单元格的内容,通过指定区域与行、列号。

我们可以使用match找到区域中重复项的位置,然后使用index显示内容。
也就是说,index与match函数的组合是VLOOKUP函数的进阶版,功能更加强大



文本处理函数

text、value文本转换

对于文本型的数字,可用“-”将其转换为数值型数字,但这样一来,数值变成负数了,所以再加一个“-”将其变为正数。 其效果与+0,*1,/1是相同的。


文本处理函数:right、left、mid、len、replace、substitute、find。还有upper、proper、lower、trim。补充未学习的:concat、search



mid(要截取的字符串,从第几位开始,截取几位)
MID的高级用法,截取任意字符串中包含有特征分隔符后的几位字符。 =MID(要截取的字符串,FIND(作为分隔符的字符串,要截取的字符串)+n, 截取几位)


Trim()删除字符串首尾的空白,但会保留字符串内部作为词与词之间分隔的空格。


if({1,0},A2,A1),{1,0}是数组。第三个参数必须要在查找区域的左边,如果不在可以使用if函数夹数组变换一下。


数组:就是单元的集合或是一组处理的值集合。可以写一个以数组为参数的公式,即数组公式,就能通过这个单一的公式,执行多个输入的操作并产生多个结果——每个结果显示在一个单元中。Excel中数组公式非常有用,尤其在不能使用工作表函数直接得到结果时,数组公式显得特别重要,它可建立产生多值或对一组值而不是单个值进行操作的公式。


数学和三角函数
Subtotal返回一个数据列表或数据库的分类汇总。

SUMPRODUCT函数是在给定的几组数组中,将数组间对应的元素相乘,并返回乘积之和。

sumifs(实际求和区域,第一个条件区域,第一个对应的求和条件,第二个条件区域,第二个对应的求和条件,第N个条件区域,第N个对应的求和条件)


sumif、count、countifs、Hyperlink超级链接、超级表格

round、int;
roundup,rounddown;
floor、ceiling;

trunc求商、sign、sqrt、mode众数、trimmean、clean


时间日期函数

Today、now、year、month、day、hour、minute、second、time、date、weekday、weeknum、datedif。

DATEDIF函数是Excel隐藏函数,其在帮助和插入公式里面没有。 返回两个日期之间的年\月\日间隔数。常使用DATEDIF函数计算两日期之差。包含D,M,Y,YD,YM,MD。


统计函数
COUNTA函数功能是返回参数列表中非空的单元格个数。利用函数 COUNTA 可以计算单元格区域或数组中包含数据的单元格个数。如果不需要统计逻辑值、文字或错误值,请使用函数 COUNT。


COUNTA函数功能是返回参数列表中非空的单元格个数。利用函数 COUNTA 可以计算单元格区域或数组中包含数据的单元格个数。如果不需要统计逻辑值、文字或错误值,请使用函数 COUNT。

mod、indirect给定单元名字引用返回最终单元格的值。

Rank、 Small 、Large(统计函数),row、column(查找与引用函数)。


// Summary //

function Summary() {
	let category_field = "规格型号"
	let summary_field = "总重(kg)"
	let up_or_down = "below"
	let fill_field = ["B:C", "L:M"]
	let invert_is_summary = false

	group_and_summary(category_field, summary_field, up_or_down)
	fill_empty_cells(fill_field, up_or_down)
	remove_reference()
	remove_redundant(category_field, invert_is_summary)
}

function group_and_summary(category_field, summary_field, up_or_down_option) {
	ActiveSheet.UsedRange.Select()
	let category_column_number = loc_column_from_name(category_field)
	let summary_column_number = loc_column_from_name(summary_field)
	// Warrning: 第一行必须是字段行。
	if (up_or_down_option === "above") {
		Selection.Subtotal(category_column_number, xlSum, Array(summary_column_number), true, false, xlSummaryAbove);
	}
	else if (up_or_down_option === "below") {
		Selection.Subtotal(category_column_number, xlSum, Array(summary_column_number), true, false, xlSummaryBelow)
	} else {
		throw null
	}

	Range("A1").Select();
}
function fill_empty_cells(fill_field, fill_up_or_down = true) {
	ClearCellsFormats()
	fill_field = fill_field.join(",")
	Range(fill_field).Select()

	let empty_cells_arry = []
	let rngIntersection = Application.Intersect(ActiveSheet.UsedRange, Selection)
	//Console.log(rngIntersection.Count)
	for (let cell of rngIntersection) {
		if (cell.Text === "") {
			empty_cells_arry.push(cell.Address())
		}
	}
	let empty_rng = empty_cells_arry.join(", ")
	let first_empty_cell = Range(empty_cells_arry[0])
	Range(empty_rng).Select();
	first_empty_cell.Activate();

	if (fill_up_or_down) {
		let target_cell = first_empty_cell.Offset(-1, 0).Address().replace(/\$/g, '')
		Selection.Formula = `=${target_cell}`;
	} else {
		let target_cell = first_empty_cell.Offset(1, 0).Address().replace(/\$/g, '')
		Selection.Formula = `=${target_cell}`;
	}
	AddCellsFormats()
}

function remove_reference() {
	ActiveSheet.Cells.Select();
	ActiveSheet.Cells.Copy();
	ActiveSheet.Cells.PasteSpecial(xlPasteValues, xlPasteSpecialOperationNone, false, false);
	Application.CutCopyMode = false;
	Range("A1").Select();
}

function remove_redundant(category_field, invert_is_summary) {
	let rng = ActiveSheet.UsedRange
	//	let category_field = "规格型号"
	//	let invert_option = true
	// Warrning: 第一行必须是字段行。
	let del_rows
	if (invert_is_summary) {
		rng.AutoFilter(loc_column_from_name(category_field), "*汇总");
		del_rows = `2:${rng.Rows.Count}`
		Rows.Item(del_rows).Select();
		Selection.Delete(xlShiftUp);
	} else {
		rng.AutoFilter(loc_column_from_name(category_field), "<>*汇总*");
		del_rows = `2:${rng.Rows.Count}`
		Rows.Item(del_rows).Select();
		Selection.Delete(xlShiftUp);
	}
	ClearOutline()
	ShowAllDataAndScrollTop()
}

function loc_column_from_name(fieldName) {
	let rngIntersection = Application.Intersect(ActiveSheet.UsedRange, Rows.Item("1:5"))
	for (let cell of rngIntersection) {
		if (cell.Text === fieldName) {
			// Console.log(cell.Column)
			return cell.Column
		}
	}
}

function ShowAllDataAndScrollTop() {
	ActiveSheet.ShowAllData();
	ActiveWindow.ScrollRow = 3;
}

function ClearCellsFormats() {
	Cells.Select();
	Cells.ClearFormats();
	Range("A1").Select()
}

function AddCellsFormats() {
	ActiveSheet.UsedRange.Select();
	const borders = [
		Selection.Borders.Item(xlEdgeLeft),
		Selection.Borders.Item(xlEdgeTop),
		Selection.Borders.Item(xlEdgeBottom),
		Selection.Borders.Item(xlEdgeRight),
		Selection.Borders.Item(xlInsideVertical),
		Selection.Borders.Item(xlInsideHorizontal)
	];
	const setBorderProperties = (border) => {
		border.Weight = xlThin;
		border.LineStyle = xlContinuous;
		border.ColorIndex = xlColorIndexAutomatic;
		border.TintAndShade = 0;
	};
	borders.forEach(setBorderProperties);
	Selection.HorizontalAlignment = xlHAlignCenter;
	Range("A1").Select()
}

function ClearOutline() {
	Cells.Select();
	Selection.ClearOutline();
	Range("A1").Select()
}

function Sort1() {
    const sheet = ActiveSheet;
    sheet.Sort.SortFields.Clear();
    sheet.Sort.SortFields.Add(Range("B2:B377"), xlSortOnValues, xlAscending, "", undefined);
    sheet.Sort.SortFields.Add(Range("C2:C377"), xlSortOnValues, xlAscending, "", undefined);
    sheet.Sort.SortFields.Add(Range("D2:D377"), xlSortOnValues, xlAscending, "", undefined);
    sheet.Sort.SortFields.Add(Range("L2:L377"), xlSortOnValues, xlAscending, "", undefined);
    sheet.Sort.Header = xlYes;
    sheet.Sort.Orientation = xlSortColumns;
    sheet.Sort.MatchCase = false;
    sheet.Sort.SortMethod = xlPinYin;
    sheet.Sort.SetRange(sheet.UsedRange);
    sheet.Sort.Apply();
}

// 整理tekla导出清单 //

function trimUsedRange() {
	// for (const cell of ActiveSheet.UsedRange) {
	// 	if (typeof (cell.Value2) !== 'undefined') {
	// 		cell.Value2 = String(cell.Value2).trim()
	// 	}
	// }
	for (let i = 1; i <= ActiveSheet.UsedRange.Count; i++) {
		let trimmedText = String(ActiveSheet.UsedRange.Item(i).Value2).trim()
		if (trimmedText !== "undefined") {
			ActiveSheet.UsedRange.Item(i).Value2 = trimmedText
		}
	}
}

function orgnaize_table_headers() {
	Range("1:4, 6:6").Select();
	Selection.Delete(xlShiftUp);
	Range("A1").Select();
}

function delete_blank_rows(fieldName) {
	let rng = ActiveSheet.UsedRange
	let blank_row_int = loc_column_from_name(fieldName) // 5
	rng.AutoFilter(blank_row_int, Array(""), xlFilterValues, undefined, undefined);
	Rows.Item(`2:${rng.Rows.Count}`).Select();
	Selection.Delete(xlShiftUp);
	ActiveWindow.ScrollRow = 1;
	ActiveSheet.ShowAllData();
}

function moveColumn() {
	let origin = "F:F"
	let target = "D:D"
	Columns.Item(origin).Select();
	Selection.Cut(undefined);
	Columns.Item(target).Select();
	ActiveSheet.Select(false);
	Selection.Insert(xlShiftToRight, undefined);
}

// ActiveSheet.Cells.Select();
// ActiveSheet.Cells.AutoFilter(undefined, undefined, xlAnd, undefined, undefined);

//	填充

// 清理第二空白行,零件号为空的行,需要填充后才能执行这一步
// 重用delete_blank_rows即可。

// TODO:自定义创建表头
posted @ 2026-02-25 13:11  霆枢  阅读(2)  评论(0)    收藏  举报