• 包含8个自定义函数： 1.提取中文,支持多个中英文交替2.赋值3.Copy首行，给其他行赋值4.获得链接5.截字符串中首尾两个-之间的部分6.提取中文前面的英文7.截取字符串中最后一次出现要str之后的字符串
• word版160多个VBA自定义函数大全，功能强大，复制进excel里就能使用。
• Option Explicit Type cwType xh As Integer xz As String cw As String sl As Integer End Type Sub test() Debug.Print GetChaoShiTable(ActiveSheet) ...Function GetChaoShiTable(sht) ...
Option Explicit

Type cwType
xh As Integer
xz As String
cw As String
sl As Integer
End Type

Sub test()
Debug.Print GetChaoShiTable(ActiveSheet)
End Sub

Function GetChaoShiTable(sht)

Dim i, cwArr() As cwType, count, j, tableContent

count = 0
For i = 3 To sht.UsedRange.Rows.count
If InStr(sht.Cells(i, "A"), "汇总") = 0 And InStr(sht.Cells(i, "A"), "总计") = 0 And sht.Cells(i, "J") <> 0 Then
count = count + 1
ReDim Preserve cwArr(1 To count)
Dim tempcw As cwType
With tempcw
.xz = sht.Cells(i, "A")
.cw = sht.Cells(i, "B")
.sl = sht.Cells(i, "J")
End With
cwArr(count) = tempcw
End If
Next

'排序
For i = LBound(cwArr) To UBound(cwArr)
For j = i + 1 To UBound(cwArr)
If cwArr(i).sl < cwArr(j).sl Then
Dim temp As cwType
temp = cwArr(i)
cwArr(i) = cwArr(j)
cwArr(j) = temp
End If
cwArr(i).xh = i
Next
Next

'生成字符串
tableContent = ""
count = 0
For i = LBound(cwArr) To UBound(cwArr)
count = count + 1
If count > 10 Then Exit For

tableContent = tableContent & "<tr>" & vbCrLf

tableContent = tableContent & vbTab & "<td>" & cwArr(i).xh & "</td>" & vbCrLf
tableContent = tableContent & vbTab & "<td>" & cwArr(i).xz & "</td>" & vbCrLf
tableContent = tableContent & vbTab & "<td>" & cwArr(i).cw & "</td>" & vbCrLf
tableContent = tableContent & vbTab & "<td>" & cwArr(i).sl & "</td>" & vbCrLf

tableContent = tableContent & "<tr>"

Next

GetChaoShiTable = tableContent
End Function



展开全文

1.首先Excel要引用相应的ActiveX库
2.新增一个类模块
'class name: adosql for vba use
Option Explicit
Private Sub class_initialize() '构造函数
ObjConnection.CommandTimeout = 15
ObjConnection.ConnectionTimeout = 15
End Sub
Public Sub openDsn(strDSN As String) '打开数据库连接
If Len(strDSN) = 0 Then
MsgBox "DSN不能为空."
Exit Sub
End If
If Right(strDSN, 1) = ";" Then
ObjConnection.Open strDSN
Else
ObjConnection.Open strDSN & ";"
End If
End Sub
Public Sub setCmd(strQUERY As String, cmdTYPE As Integer) '设置命令
ObjCommand.ActiveConnection = ObjConnection
ObjCommand.CommandText = strQUERY
ObjCommand.CommandType = cmdTYPE '1-语句 4-存储过程
ObjConnection.CursorLocation = 3 '本地游标库提供的客户端游标
ObjRecordSet.CursorType = 3 '静态游标
End Sub
Public Sub inpara(s As Integer, paname As String, paformat As String, palen As String, pavalue As String) '参数个数 参数名 字符类型 长度 值
Set para(s) = ObjCommand.CreateParameter(paname, paformat, 1, palen, pavalue)
ObjCommand.Parameters.Append para(s)
End Sub
Public Sub inparastr(s As Integer, paname As String, palen As String, pavalue As String) '参数个数 参数名 长度 值
Set para(s) = ObjCommand.CreateParameter(paname, "202", 1, palen, pavalue)
ObjCommand.Parameters.Append para(s)
End Sub
Public Sub inparaint(s As Integer, paname As String, pavalue As String) '参数个数 参数名 值
Set para(s) = ObjCommand.CreateParameter(paname, "3", 1, "8", pavalue)
ObjCommand.Parameters.Append para(s)
End Sub
Public Sub inparadate(s As Integer, paname As String, pavalue As String) '参数个数 参数名 值
Set para(s) = ObjCommand.CreateParameter(paname, "7", 1, "10", pavalue)
ObjCommand.Parameters.Append para(s)
End Sub
Public Sub inparabool(s As Integer, paname As String, pavalue As String) '参数个数 参数名 值
Set para(s) = ObjCommand.CreateParameter(paname, "11", 1, "1", pavalue)
ObjCommand.Parameters.Append para(s)
End Sub
Public Sub inparadec(s As Integer, paname As String, pavalue As String) '参数个数 参数名 值
Set para(s) = ObjCommand.CreateParameter(paname, "14", 1, "18", pavalue)
ObjCommand.Parameters.Append para(s)
End Sub
Public Sub outpara(s As Integer, paname As String, paformat As String, palen As String) '参数个数 参数名 字符类型 长度
Set para(s) = ObjCommand.CreateParameter(paname, paformat, 2, palen)
ObjCommand.Parameters.Append para(s)
End Sub
Public Sub inoutpara(s As Integer, paname As String, paformat As String, palen As String, pavalue As String) '参数个数 参数名 字符类型 长度 值
Set para(s) = ObjCommand.CreateParameter(paname, paformat, 3, palen, pavalue)
ObjCommand.Parameters.Append para(s)
End Sub
Public Function outvalue(s As Integer) As String '返回指定参数返回值
outvalue = para(s).Value
End Function
Public Sub rlspara(s As Integer) '释放参数对象
Dim i As Integer
For i = 1 To s
ObjCommand.Parameters.Delete para(i).Name
Set para(i) = Nothing
Next
End Sub
Public Function execRT() As Integer '执行CMD 并返回记录数
Set ObjRecordSet = ObjCommand.Execute
execRT = CInt(ObjRecordSet.RecordCount)
End Function
Public Function getRT() As ADODB.Recordset '返回记录集
Set getRT = ObjCommand.Execute
End Function
Private Sub mfirst() '游标定位到第一条
ObjRecordSet.MoveFirst
End Sub
Private Sub mnext() '游标定位到下一条
ObjRecordSet.MoveNext
End Sub
Public Function getvalue(fieldname As Integer) As String '取值 BY name
getvalue = ObjRecordSet.Fields(fieldname).Value
End Function
Public Function numvalue(fieldnum As Integer) As String '取值 BY number
numvalue = ObjRecordSet.Fields(fieldnum).Value
End Function
Public Sub clsrcd() '关闭结果集
ObjRecordSet.Close
End Sub
Public Sub clscon() '关闭连接
ObjConnection.Close
End Sub
Public Function scalar(strQUERY As String) As String '返回字符串值
Dim ct As Integer
Call setCmd(strQUERY, 1)
ct = execRT()
If ct > 0 Then
Call mfirst
scalar = numvalue(0)
Else
scalar = ""
End If
Call clsrcd
End Function
Public Sub rlscon() '释放所有对象
Set ObjRecordSet = Nothing
Set ObjCommand = Nothing
ObjConnection.Close
endif
Set ObjConnection = Nothing
End Sub
Private Sub Class_Terminate() '析构函数
Set ObjRecordSet = Nothing
Set ObjCommand = Nothing
ObjConnection.Close
endif
Set ObjConnection = Nothing
End Sub
3.新增一个SUB在模块里
测试连接数据库(PROGRESS)
Option Explicit
Public Sub test1()
Dim sqlstr As String
sqlstr = "select ifnull(sum(op_qty_comp),0) from pub.op_hist where op_domain = 'CN01' and op_site = 'CN01' and op_type = 'BACKFLSH' and op_date = ? and op_part = ? and op_wo_op = ?"
End Sub
测试连接数据库(MS SQLSERVER)
Option Explicit
Public Sub test2()
Dim sqlstr As String
sqlstr = "select isnull(sum(sodqty),0) from salesdetail where plantcode = 'CN01' and orddate >= ?"
End Sub
这样就可以比较方便的取到数据 输出到EXCEL表格里了

展开全文
• vba自定义类型返回函数vba自定义类型返回函数vba自定义类型返回函数
• 不同类型的变量可以组合起来用来创建用户定义的类型（如熟知的 C 编程语言中的 structs）。当需要创建单个变量来记录多项相关的信息时，用户定义类型是十分有用的。 可以用 Type 语句创建用户定义的类型，该...
不同类型的变量可以组合起来用来创建用户定义的类型（如熟知的 C 编程语言中的 structs）。当需要创建单个变量来记录多项相关的信息时，用户定义类型是十分有用的。

可以用 Type 语句创建用户定义的类型，该语句必须置于模块的声明部分。用户定义类型可以用适当的关键字声明为 Private 或 Public，例如：

Private Type MyDataType
-或-

Public Type MyDataType

例如，可以创建一个记录有关计算机系统的信息的用户定义类型：

'声明（一个标准模块的）。
Private Type SystemInfo
CPU As Variant
Memory As Long
VideoColors As Integer
Cost As Currency
PurchaseDate As Variant
End Type

声明用户定义类型的变量
对同一种用户定义类型，可以声明为局部的、私有的或公用的模块级变量：

Dim MySystem As SystemInfo, YourSystem As SystemInfo

参考文章：点击
展开全文
• vba用户自定义类型vba用户自定义类型vba用户自定义类型vba用户自定义类型
• 这些新对象可以包含自定义的属性和方法。实际上，窗体正是这样一种模块，在其上可安放控件。再次重复一遍，窗体正是这样一种模块。用模块创建对象，这些对象可被应用程序内的过程调用。标准模块只包含代码，而...


（接上讲）
3.类模块 类模块是面向对象编程的基础，可以在类模块中编写代码，为并着手建设，为建立新对象做基础准备。这些新对象可以包含自定义的属性和方法。实际上，窗体正是这样一种类模块，在其上可安放控件。再次重复一遍，窗体正是这样一种类模块。
用类模块创建对象，这些对象可被应用程序内的过程调用。标准模块只包含代码，而类模块包含代码又包含数据，可视为没有物理表示的控件。什么是没有物理表示呢？看过我之前章节的朋友马上就会想到：没有占用内存。对的，在类没有实例化之前是不占用内存的。

四 模块的设计
创建应用程序的最初部分是设计。首先需要为应用程序设计一个用户界面，这个界面的设计比较容易。但设计代码的结构就是一项较复杂的工作。构造应用程序的方法不同，可能会造成应用程序的性能以及代码的可维护性、可使用性不同。
典型应用程序包括若干个模块：应用程序中每个窗体的窗体模块、共享代码的标准模块和类模块。每个模块包含若干含有代码的过程：Event（事件）过程，Sub过程，Function过程，Property过程。在很多情况中都存在着多个对象共享的重复过程。这种情况最好创建一个共享的过程，使大家都可以调用它。即使将来修改这些程序，则只在一个地方修改就可进行全部修改，这将大大提高程序的可读性和可维护性。可以把所有的共享操作放在标准的模块中。
在设计类模块时要注意到接口封装，类为基于它创建的所有对象定义了属性（Properties)，方法(Metho)，事件(Events)，这些属性、方法和事件也称为类的接口(Interface)。我们务必要做到接口只可升级，不可重新定义。其中的道理不再多说。关于什么是属性、方法和事件，相信大家学到这里已经有了一个深刻的理解和认识，如果还有什么模糊的地方也不要紧，在后续的教程中还会继续。关于类的知识，其实就是理解这几个关键知识点的过程。你确实理解了，我的讲解也就结束了。

五 类模块的定义及总结
1 类是对象的定义。包含对象动作行为的相关信息，包括对象的名称、方法、属性和事件。但它不是对象本身，因为它不存在于内存中。当执行的程序代码实例化类时，就在内存中建立类的新执行个体，即对象。虽然只有一个类，但可在内存中建立多个相同类型的对象。
2 可以把类看作理论上的对象，也就是说，它提供对象的灵魂，但本身在内存中没有肉身（对象）的存在。从这个灵魂可以建立数量不限的肉身（对象）。每一个从类建立的肉身对象都有相同的接口：属性、方法和事件。但各肉身（对象）都像独立实体一样运作；例如，一个对象的属性可以设定成与其它相同类型对象不同的值。
3 Microsoft® Visual Basic® for Applications (VBA) 项目可以包含两种不同的类模块：一种是基本类模块，没有任何使用者接口与其相关联，另一种是与窗体或其它组件相关联的类模块。与窗体相关联的类模块其实与基本类模块完全一样，但只有相关联的窗体存在于内存中时，它们才存在于内存中。有相关联类模块之对象的范例是 Userforms、Microsoft® Access 窗体和报表、Microsoft® Word ThisDocument 对象、还有 Microsoft® Excel ThisWorkbook 和 SheetN 对象。
4 建立类的肉身（对象）若要在程序代码中使用自定义的对象，请先建立该对象之类的新执行个体。当我们建立类的肉身时，即在内存中建立由类定义的对象。可以从任何类型的模块内部，建立类的新执行个体。建立 ClassName 类型的对象变量，然后使用 New 关键词，将类的新肉身指定给对象变量。
今日内容回向：
1 类模块的有效行为是什么？
2 类模块有几类？

在取代OFFICE新的办公软件没有到来之前，谁能在数据处理方面做到极致，谁就是王者。其中登峰至极的技能非VBA莫属！众鸟高飞尽，孤云独去闲。相看两不厌，只有敬亭山。
学习VBA是个过程，这个过程是自己忍受孤独的过程。
“水善利万物而不争”，你看她绵绵密密，微处则无声，巨则汹涌。学习亦如此，把握现在，为达千里，需要默默耕耘，知道什么是自己所需要的，不要蜷缩在一小块自认为天堂的世界里，待到暮年时去自欺欺人。要在当下，用一颗充满生机的心灵，努力提高自己，这才是进取。越是有意义的事情，困难会越多。愿力决定始终，智慧决定成败。不管遇到什么，都是风景。看淡纷争，看轻得失。一杯茶，满也好，少也好，不要去计较；浓也好，淡也好，其中都有值得品的味道。去感悟真实的时间，静下心，多学习，积累福报。而不是天天混日子，也不是天天熬日子。一切众生的心都在变化，像时间一样，永远不会停留，把握现在就是福报。
VBA是利用Office实现自己小型办公自动化的有效手段，我记得20年前自己初学VBA时，那时的资料甚少，只能看源码自己琢磨,真的很难。20年过去了，为了不让学习VBA的朋友重复我之前的经历，我根据自己多年VBA实际利用经验，推出了五部VBA专门教程，回向给需要学习的朋友：
第一套：VBA代码解决方案 是VBA中各个知识点的讲解，覆盖绝大多数的VBA知识点，初学必备；
第三套：VBA数组与字典解决方案 数组和字典是VBA的精华，字典是VBA代码水平提高的有效手段，值得深入的学习。
第四套：VBA代码解决方案之视频 是专门面向初学者的视频讲解，可以快速入门，更快的掌握这门技能。
第五套：VBA中类的解读和利用 这是一部高级教程，讲解类的虚无与肉身的度化，可以对促进自己理论的提高。
学习的过程也是修心的过程，修一个平静的心。在代码的世界中，心平静了，心情好了，身体自然而然就好。心静则正，内心里没有那么多邪知邪见，也就没有那么多妄想。在平静中积累自己的财富。我的上述教程是我多的经验的传递，大家可以根据1,3,2,5或者是4,3,2,5的顺序逐渐深入的逐渐学习。

最后将一阙词送给致力于VBA学习的朋友：
浮云掠过，暗语无声，
唯有清风，惊了梦中啼莺。
望星，疏移北斗，
奈将往事雁同行。
阡陌人，昏灯明暗，忍顾长亭。
多少VBA人，
暗夜中，悄声寻梦，盼却天明。
怎无凭！
分享成果，随喜正能量

展开全文
• VB自定义的一个原创数组， 元素差不多可为任意类型， 像C语言的数组一样，有Push、Update等很实用的方法。
• VBA中， 模块相当于C语言中的模板要单独放到模块中(自定义类型和子过程放在模块中)，模板的名称就是的名称，可以做为新的类型进行声明和定义。1 自定义类型的声明和使用1.1 自定义类型的声明Public ...
• 函数作用:删除单元格自定义名称.....................88 '76.函数作用:从文件路径中取得文件名...................89 '77.函数作用:取得一个文件的扩展名.....................89 '78.函数作用:取得一个文件的路径.....
• VBA自定义函数. 6个简单而有用的VBA自定义函数.
• ，在VBA中是很抽象的，但正是因为它的抽象，才更具研究的价值。研究的过程往往是从具体到抽象，再到具体，从具体中升华出我们的理论认知，然后再用抽象的理论指导我们的具体行动。所以，随着我们学习、应用VBA的...
• 1.最近对Excel文件使用较为频繁，故写了几个函数，通过调用可以实现一些基本功能，仅供参考： （1）遍历指定文件夹下所有文件，并获得文件名（如需要获得指定的文件类型，请增加一个判断条件来判断文件类型） ...
• 创建调用宏的自定义菜单 列中的空白单元格到向下填充值 HTML 文件中创建的目录等
• EXCEL自定义排序最多只能有255个值,超过了就不能用自定义序列了,使用以下方法 求助excelhome论坛得出的答案 Sub 自定义排序() Application.ScreenUpdating = False '排序标准 Dim d As Object Set d = ...
• 海量VBA自定义函数，希望大家能喜欢。在excel，access开发时非常有用
• 本篇介绍自定义功能区的要点。 xlsx 文档可以视为一种经过压缩的文档格式。我们新建一个 Excel 文档，另存为启用宏的工作簿 (xlsm) 格式（文件名：工作簿1.xlsm)，将文件名更名为：工作簿1.xlsm,zip。忽略警告。用 ...
• Excel-165个VBA自定义函数大全
• 大家好，在上两讲中讲了模块的调试行为，对于我们写代码人员来讲，要充分地理解每个知识点的概念，才能在实际工作中灵活运用，在我的第一套教程《VBA代码解决方案》中，我推出的是一种积木编程的思想，要求大家...
• 给Excel VBA 自定义函数添加说明
• 自定义的函数要放在模块内才能被使用 放在模块中使用才会出现自动补齐
• 今天主要讲讲自定义对话框这一章，中间鸽了一小部分的函数过程，WindowsAPI、连接数据库的内容还没学，后续再更新。 一、inputbox inputbox输入框之前已经用过了，但是除了之前VBA中用的inputbox之外，还有...
• 在图1中所示的数据集中，如果希望按单元格区域E2:E6所列序列进行排序，需要先使用AddCustomList方法为应用程序添加自定义序列，示例代码如下。 Sub SortByLists() Dim avntList As Variant, lngNum As Long ...
• 自定义函数
• VBA 自定义函数大全
• 75.删除单元格自定义名称 76.从文件路径中取得文件名 77.取得一个文件的扩展名 78.取得一个文件的路径 79.十进制转二进制 80.检查一个数组是否为空 81.字母栏名转数字栏名 82.数字栏名转文字栏名 83.判断一件活页夹...
• 大家好，我们今天继续讲解的相关知识。在上一讲中我们讲了使用WithEvents定义响应事件的对象，那么有了对象自然要跟进到事件了，这讲就给大家讲解两个新...这套VBA的解读及应用中，侧重点是理论的学习，要求大...

...