VBA 表单控件UserForm

一:简介

VBA可以通过窗体和用户进行数据交互,然后控制Excel总的内容(如新增、删除、修改、查询)。

表单控件也称为窗体控件 Form Controls

Workbook以及不同组件都有很多事件。

  • 标签:它用于表现静态文本。
  • 分组框:它用于将其他控件进行组合。
  • 按钮:用于执行宏命令。
  • 复选框:它是一个选择控件,通过单击可以选择和取消选择,可以多项选择。
  • 选项按钮:通常几个选项按钮组合在一起使用,在一组中只能选择一个选项按钮。
  • 列表框:用于显示多个选项并从中选择。只能单选。
  • 组合框:用于显示多个选项并从中选择。可以选择其中的项目或者输入一个其它值。
  • 滚动条:不是你常见的来给很长的窗体添加滚动能力的控件,而是一种选择机制。例如:调节过渡色的滚动条控件。包括水平滚动条和垂直滚动条。
    微调控件:也是一种数值选择机制,通过单击控件的箭头来选择数值。例如改变 Windows 日期或时间就会使用到微调控件。

在这里插入图片描述
在这里插入图片描述
有时候excel文件一打开就会只显示窗体控件,不会显示Excel内容,此时输入和查询只能通过提供的窗体来操作。

用户窗体 UserForm

Private Sub UserForm_QueryClose(Cancel As Interger, CloseMode As Interger)
	If MsgBox("是否关闭工作簿", vbYesNo) = vbYes Then
		ThisWorkbook.Close
	End If
End Sub

标签 Label

支持鼠标移入、移除、点击等事件,可以用于修改一些属性。

Private Sub Label1_Click()
	' 点击跳转网页
	ActiveWorkbook.FollowHyperlink "https://www.baidu.com"
End Sub

单选框 OptionButton

' 返回是否选中
OptionButton1.Value
OptionButton1.Caption
OptionButton1.Enable
' 清空
OptionButton1.Value = False

框架 Frame

框架内部的控件和框架外互不影响。
当有多个单标签时通过框架保证互相不影响,其实就是对单选按钮分组

' 获取框架里面的所有控件
For Each ss in Frame1.Controls
	If ss.Value Then
		zt.Offset(1, 2) = ss.Caption
	End If
Next ss

复选框 CheckBox

CheckBox1.Value

For i = 1 To 4
	If Controls("checkbox" & i).Value Then
		t = t & "/" & Controls("checkbox" & i).Caption 
	End If
Next i

zt.Offset(1,3) = Mid(t, 2)

复合框(下拉列表)ComboBox

Private Sub UserForm_Initialize()
	ComboBox1.List = arr
End Sub


Private Sub ComboBox1_Change()
	Dim xy As Range
	'Set result = Sheets("Sheet2").Columns(2).Find("xx",,,1)
	Set xy = Sheet2.Range("a:a").Find(ComboBox1.Text,,,1)
	If xy Is Nothing Then
		MsgBox "未查到"
	Else
		xy.Row
	End If
	ComboBox2.AddItem "xxx"
	' 直接接收是个二维数组,需要转置一下变成一维数组?
	arr = Sheet2.Range(xy.Offset(0, 1), xy.Offset(0, 3333).End(xlToLeft))
	arr = WorksheetFunction.Transpose(arr)
	ComboBox2.List = arr
End Sub
' 清空控件内容
For Each control In UserForm1.Controls
	If Mid(control.Name, 1, 4) = "TEXT" Then
		kj.Text = ""
	Else If Mid(control.Name, 1, 4) = "Comb" Then
		kj.Text = ""
	Else If Mid(control.Name, 1, 4) = "Opti" Then
		kj.Value = False
	Else If Mid(control.Name, 1, 4) = "Chec" Then
		kj.Value = False
	End If
Next kj

切换按钮 ToggleButton

ToggleButton1.Value
ToggleButton1.Caption

列表框 ListBox

可以显式单列,或者多行多列表格

ListBox1.AddItem "xxx"
arr = Range("a1").CurrentRegion
arr= WorksheetFunction.Transpose(arr)= UBound(arr, 2)

' 设置列的宽度
For i = 1 To 列
	w = w & "," & 50
Next i
w = Mid(w, 2, Len(w))

ListBox1.ColumnWiths = w
ListBox1.ColumnCount = 列
ListBox1.List = arr

图片 Image

Image1.Picture = LoadPicture("xx/yyy.png")

基础示例

' 关闭提示
Application.DisplayAlerts = True
Private Sub Workbook_Open()
	' 关闭Excel页面主窗体,先显示UserForm1
	Application.Visible = False
	UserForm1.Show 0
	' 定时器
	Application.OnTime Now + TimeValue("00:00:03"), "close"
End Sub

' 初始化加载事件
Private Sub UserForm1_Initialize() 
	Caption = "xxx"
	ComBox1.AddItem "a1"
	ComBox1.AddItem "a2"
End Sub

Sub close()
	Unload UserForm1
	' Unload Me
	Application.Visible = True
End Sub

反禁用宏示例

我们的Sheet可能有很多机密,想要查看需要弹框先输入用户名密码才可,而窗体程序需要Excel开启宏设置,如果用户关闭掉宏设置就绕过校验可以直接看到机密的内容。

解决方法:禁用时隐藏对应的Sheet并且不能取消隐藏(Sheet不能隐藏所有一个不剩,所以要预留一个空白工作簿),并且不能查看VBA源码(工具 - VBAProject属性 - 保护 - 设置密码即可)

' 全局变量写在Module中  通用  声明 中, 声明的全局变量可以在不同的UserForm中共享访问
Public value
ThisWorkbook

ThisWorkbook.Protect Password:="123456" ' 工作簿保护
ThisWorkbook.Unprotect Password:="123456" ' 取消工作簿保护

' 一般程序开始时关闭,程序运行后要重新打卡
' 关闭刷新(用于提高效率,开发时不要关闭可用于调试)
Application.ScreenUpdating = False
' 关闭中间弹出提示中断程序
Application.DisplayAlers = False

Private Sub Workbook_BeforeClose(Cancel As Boolean)
	Dim ws As Worksheet
	Sheets("空白").Visible = xlSheetVisible
	' 让其它Sheet隐藏,除了"空白"
	For Each ws In Worksheets
		If ws.Name <> "" Then 
			ws.Visible = xlSheetVeryHidden
		End If
	Next ws
	ThisWorkbook.Save
End Sub


Private Sub Workbook_Open()
	Dim ws As Worksheet
	For Each ws In Worksheets
		If ws.Name <> "" Then 
			ws.Visible = xlSheetVisible ' 可见
		End If
	Next ws

	Sheets("空白").Visible = xlSheetVeryHidden ' 隐藏且无法取消隐藏
	Application.EnableCancelKey = xlDisable ' 禁用Ctrl+Break
	Application.Visible = False
	UserForm1.Show
End Sub


Private Sub ExitBtn_Click()
	' 关闭当前窗体
	Unload Me
	ThisWorkbook.Save
	ThisWorkbook.Close
	' 退出应用程序
	Application.Quit
End Sub

注册示例

Sheet本身就是一张表,可以将注册的用户信息单独存放到一个Sheet中,并且将该Sheet隐藏起来。

Private Sub Label3_Clikc() 
	UserForm2.Show
End Sub

Private Sub CommandButton1_Click()
	Dim zh As Range, zt As Range
	If TextBox1 = "" Then MsgBox "未填入账号"Exit Sub
	If TextBox2 <> TextBox3 Then MsgBox "密码不一致"Exit Sub
	Set zh  = Sheets("注册").Range("a:a").Find(TextBox1.Text,,,1)
	If zh is Nothing Then
		Set zt = Sheets("注册").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
		zt = TextBox1.Text
		zt.Offset(0, 1) = TextBox2.Text
		zt.Offset(0, 2) = Now
		MsgBox "注册成功"
		Unload Me
	Else
		MsgBox "账号已经存请更换"
	End If
End Sub

登录示例

Private Sub CommandButton2_Click()
	' 清空
	TextBox1.Text = ""

	Dim zh As Range
	If Len(TextBox1) = 0 Then MsgBox "请输入账号" : Exit Sub
	Set zh  = Sheets("注册").Range("a:a").Find(TextBox1.Text,,,1)
	If Not zh Is Nothing Then
		If TextBox2.Text <> zh.Offset(0, 1) Then
			MsgBox "密码错误"
		End If
	Else
		MsgBox "账号不存在"
	End If
End Sub

' 监控键盘输入
Public Sub TextBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByValue)
	If KeyCode = vbKeyHome Then
		CommandButton2_Click
	End If 
End Sub
基于 NSFW Model 色情图片识别鉴黄 后面更新视频检测 项目背景: 随着互联网的快速发展,网络上的信息量呈现出爆炸式的增长。然而,互联网上的内容良莠不齐,其中不乏一些不良信息,如色情、暴力等。这些信息对青少年的健康成长和社会风气产生了不良影响。为了净化网络环境,保护青少年免受不良信息的侵害,我国政府加大了对网络内容的监管力度。在此背景下,本项目应运而生,旨在实现对网络图片和视频的自动识别与过滤,助力构建清朗的网络空间。 项目简介: 本项目基于 NSFW(Not Safe For Work)Model,利用深度学习技术对色情图片进行识别与鉴黄。NSFW Model 是一种基于卷积神经网络(CNN)的图像识别模型,通过学习大量的色情图片和非色情图片,能够准确地判断一张图片是否含有色情内容。本项目在 NSFW Model 的基础上,进一步优化了模型结构,提高了识别的准确率和效率。 项目功能: 色情图片识别:用户上传图片后,系统会自动调用 NSFW Model 对图片进行识别,判断图片是否含有色情内容。如果含有色情内容,系统会给出相应的提示,并阻止图片的传播。 视频检测:针对网络视频,本项目采用帧提取技术,将视频分解为一帧帧图片,然后使用 NSFW Model 对这些图片进行识别。如果检测到含有色情内容的图片,系统会给出相应的提示,并阻止视频的传播。 实时监控:本项目可应用于网络直播、短视频平台等场景,实时监控画面内容,一旦检测到含有色情内容的画面,立即进行屏蔽处理,确保网络环境的纯洁。
### 如何在本地部署 NSFW 模型或服务 要在本地环境中成功部署 NSFW(不适宜工作场合内容)检测模型或服务,以下是详细的说明: #### 准备环境 为了确保能够顺利运行模型和服务,需要安装必要的依赖项。这些工具和库包括但不限于以下几类: - **Python 环境**: 推荐使用 Python 3.7 或更高版本。 - **Transformers 库**: 提供加载预训练模型的功能[^1]。 - **PyTorch/TensorFlow**: 支持深度学习框架的计算需求。 - **Pillow (PIL)**: 处理图像文件并将其转换为适合输入模型的形式。 具体命令如下所示: ```bash pip install transformers torch Pillow ``` #### 加载模型与测试 通过 Hugging Face 的 `transformers` 工具包可以直接访问已有的 NSFW 图片分类模型。例如,可以采用名为 `"Falconsai/nsfw_image_detection"` 的公开模型来完成此任务[^1]。 下面是一个简单的代码片段展示如何加载该模型并对单张图片执行预测操作: ```python from PIL import Image from transformers import pipeline def classify_nsfw(image_path): # 打开指定路径下的图片文件 img = Image.open(image_path) # 初始化 image-classification 流水线对象,并指明使用的特定模型名称 classifier = pipeline("image-classification", model="Falconsai/nsfw_image_detection") # 对传入的图片调用流水线方法得到其类别标签及其置信度分数列表形式的结果 result = classifier(img) return result if __name__ == "__main__": test_img_path = "<your_test_image>" output_results = classify_nsfw(test_img_path) print(output_results) ``` 注意替换 `<your_test_image>` 成实际存在的图片绝对或者相对地址字符串值之前再尝试运行以上脚本。 #### 构建 RESTful API 服务 如果希望进一步扩展功能至 Web 应用程序层面,则可考虑利用 Flask/Django 这样的轻量级 web 开发框架构建起支持 HTTP 请求交互的服务端接口。这里给出基于 FastAPI 实现的一个简单例子作为示范用途: ```python import uvicorn from fastapi import FastAPI, File, UploadFile from PIL import Image from io import BytesIO from typing import List from pydantic import BaseModel app = FastAPI() class Prediction(BaseModel): label: str score: float @app.post("/predict/", response_model=List[Prediction]) async def predict(file: UploadFile = File(...)): try: contents = await file.read() pil_image = Image.open(BytesIO(contents)) clf_pipeline = pipeline('image-classification', model='Falconsai/nsfw_image_detection') predictions = clf_pipeline(pil_image) formatted_preds = [{"label": pred['label'], "score": round(pred['score'], 4)} for pred in predictions] return formatted_preds except Exception as e: raise ValueError(f"Error processing uploaded file {e}") if __name__ == '__main__': uvicorn.run(app, host='0.0.0.0', port=8000) ``` 启动服务器之后即可向 `/predict/` 路径发送 POST 请求附带上传待分析的目标图片获取返回结果了。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风流 少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值