分类 Visual Basic for Applications 下的文章

VBA西北人摇色子模拟

主要模拟以下场景:
庄稼:3个不知道
对家:揭开
看以下庄稼赢的概率
1.gif

Option Explicit

Sub 再来一把_Click()
    '随机生成点数
    Dim tmp(6) As Variant
    
    tmp(0) = Application.WorksheetFunction.RandBetween(1, 6)
    Worksheets("sheet1").Range("B3").Formula = "=UNICHAR(" & (tmp(0) + 9855) & ")"
    
    tmp(1) = Application.WorksheetFunction.RandBetween(1, 6)
    Worksheets("sheet1").Range("B4").Formula = "=UNICHAR(" & (tmp(1) + 9855) & ")"
    
    tmp(2) = Application.WorksheetFunction.RandBetween(1, 6)
    Worksheets("sheet1").Range("B5").Formula = "=UNICHAR(" & (tmp(2) + 9855) & ")"
    
    tmp(3) = Application.WorksheetFunction.RandBetween(1, 6)
    Worksheets("sheet1").Range("D3").Formula = "=UNICHAR(" & (tmp(3) + 9855) & ")"
    
    tmp(4) = Application.WorksheetFunction.RandBetween(1, 6)
    Worksheets("sheet1").Range("D4").Formula = "=UNICHAR(" & (tmp(4) + 9855) & ")"
    
    tmp(5) = Application.WorksheetFunction.RandBetween(1, 6)
    Worksheets("sheet1").Range("D5").Formula = "=UNICHAR(" & (tmp(5) + 9855) & ")"
    
    '排序,从小到到
    Dim i, j, t As Integer
    For i = 0 To 5
        For j = 0 To 5
            If tmp(i) > tmp(j) Then
                t = tmp(i)
                tmp(i) = tmp(j)
                tmp(j) = t
            End If
        Next
    Next
    
    'Worksheets("sheet1").Range("K2:P2") = tmp
    
    Dim h1 As Integer
    h1 = 0
    For i = 5 To 0 Step -1
        If tmp(i) = 1 Then
            h1 = h1 + 1
        End If
    Next
        
    If h1 >= 2 Then
        Worksheets("sheet1").Range("B6") = "胜"
        Worksheets("sheet1").Range("D6") = "负"
    ElseIf h1 = 1 Then
        If (tmp(5) = tmp(4) Or tmp(4) = tmp(3) Or tmp(3) = tmp(2) Or tmp(2) = tmp(1)) Then
            Worksheets("sheet1").Range("B6") = "胜"
            Worksheets("sheet1").Range("D6") = "负"
        Else
            Worksheets("sheet1").Range("B6") = "负"
            Worksheets("sheet1").Range("D6") = "胜"
        End If
    Else
        If (tmp(5) = tmp(4) And tmp(4) = tmp(3)) Or (tmp(4) = tmp(3) And tmp(3) = tmp(2)) Or (tmp(3) = tmp(2) And tmp(2) = tmp(1)) Or (tmp(2) = tmp(1) And tmp(1) = tmp(0)) Then
            Worksheets("sheet1").Range("B6") = "胜"
            Worksheets("sheet1").Range("D6") = "负"
        Else
            Worksheets("sheet1").Range("B6") = "负"
            Worksheets("sheet1").Range("D6") = "胜"
        End If
    End If
        
    If Worksheets("sheet1").Range("B6") = "胜" Then
        Worksheets("sheet1").Range("B7") = Worksheets("sheet1").Range("B7") + 1
    Else
        Worksheets("sheet1").Range("D7") = Worksheets("sheet1").Range("D7") + 1
    End If
    
    'Worksheets("sheet1").Range("B6") = "胜"
    'Worksheets("sheet1").Range("D6") = "负"
End Sub
Sub 重置_Click()
    Worksheets("sheet1").Range("B6") = ""
    Worksheets("sheet1").Range("D6") = ""
    
    Worksheets("sheet1").Range("B7") = 0
    Worksheets("sheet1").Range("D7") = 0
    
End Sub

文件下载:摇色子.zip

VBA对话框批量添加按钮

说明:这篇不是原创内容,来自ExcelHome。时间长了也忘了具体网址了,这里摘录下来方面以后查找。

1.插入一个类模块,命名为MyCla,代码如下:

Public WithEvents Butt As MSForms.CommandButton
Private Sub Butt_Click()
    Dim x, y As Integer  
    strs = Split(Butt.Tag, "|")
    x = strs(0)
    y = strs(1)
End Sub

2.插入一个用户窗体UserForm1,代码如下:

Private Sub UserForm_Initialize()
    Dim i, j As Integer
    '画按钮,默认隐藏
    For i = 0 To MAPHEIGHT - 1 '行
        For j = 0 To MAPWIDTH - 1 '列
            Set buttons(i, j).Butt = UserForm1.Controls.Add("Forms.Commandbutton.1")
            With buttons(i, j).Butt
                .Caption = ""
                .Height = 18
                .Width = 18
                .Tag = i & "|" & j
                .PicturePosition = 12
                .Visible = False
                '.Caption = i & j
                If i = 0 Then
                    .Top = 10
                Else
                    .Top = buttons(i - 1, j).Butt.Top + 18
                End If
                If j = 0 Then
                    .Left = 150
                Else
                    .Left = buttons(i, j - 1).Butt.Left + 18
                End If
            End With
        Next
    Next
End Sub

效果图:

VBA入门基础(二)

之前提了一下用VBA做个推箱子游戏,当然这个纯属是拿来练手做教程用的,如果真的用vba来做游戏估计你让你搞到吐,Excel真心不合适做游戏!

一、准备工作(开启Excel宏支持)

说明:因需要通过Excel宏实现相应功能,所以使用前必须确保宏命令可以正常执行。本次通过Excel 2016演示宏命令启动,其他版本office基本相同,可参考执行。


1.启动Excel 2016,打开文件菜单



2.点击选项



3.点击信任中心,打开信任中心设置(T)...



4.点击宏设置,将宏设置选择为启用所有宏(不推荐:可能会运行有潜在危险的代码)(E)。(注意:此处选择为禁用所有宏,并发出通知(D)也可以,在首次启动是手动选择运行宏即可)

二、基本概念

概念解释是根据个人理解解释的,更准确的表示请自行找度娘

Workbook 工作簿

一个打开的Excel相当于一个Workbook,当前workbook可以用ThisWorkBook表示,或者Workbooks("名称")。

worksheet 工作表

每个打开的workbook西方看到的就是sheet,一个workbook至少有一个worksheet。

工作表可以用名称表示,也可以用序号,比如worksheets(“名称”)或worksheet(1)

Range 区域

可以是一个单元个,多个连续单元格或不连续单元格,如Range(“A1”),Range(“A:Z)

Cells 单元格

Cells是指单元格和Range不同的之处在于Cells是用的参数,Cells(行,列)。比如A1单元格表示为Cells(1,1)。

sub,定义一个过程,可以直接运行

比如:

sub test()
    Thisworkbook.Worksheets(1).Range("A1")="A1"
end sub

function,定义一个函数,只能被调用不能直接运行

function test1()
    ThisWorkbook.Worksheets(1).cells(1,1)="A1"
end function

三、开始使用vba。

启动Excel,打开或新建一个Excel文件,按Alt+F11,在左侧工程面板点右键,插入-模块

点击模块1,在下方属性区域可以修改名称。

四,注意事项

1.标点符号请使用英文输入法下的标点符号
2.尽可能给代码添加注释,这个好习惯在代码很长的项目中会让你深有感受
3.vba代码不区分大小写,比如str和Str是一样的,不过为了方便维护,建议统一风格
4.vba默认情况下变量不用声明即可使用,例如:

str = “heollo VBA”
msgbox(str)

如果项目比较大,你会为此付出惨痛代价,比较单词输入错误了,系统不会提示任何错误。建议开启变量要求声明功能。
点击工具,选项,勾选要求变量声明。

开启该功能后,新插入的模块会多出来一句Option Explicit,再运行声明的代码会提示出错。需要改一下:

Option Explicit

Sub test5()
Dim str As String
str = "Hello VBA!"
MsgBox (str)
End Sub

或者

Option Explicit

Sub test5()
Dim str  = "Hello VBA!"
MsgBox (str)
End Sub

给office添加功能按钮

这篇文章秉承拿来主义思想,学会复制粘贴使用即可,不做理论上的讲解,想深入学习的同学自行百度Ribbon,XML相关知识。
这篇文章主要介绍一下怎样给office菜单功能添加自定义的功能。在起名字的时候纠结了一下,本想直接写成《Microsoft Ribbon菜单功能区添加自定功能》,怕大家看到E问头皮发麻,就写了个很土但是能看懂的名字。

一、准备工作

几篇参考文档:
1.Customizing the 2007 Office Fluent Ribbon for Developers https://docs.microsoft.com/zh-cn/previous-versions/office/developer/office-2007/aa338199(v=office.12)
2.VSTO二次开发PowerPoint之:XML方式创建Ribbon并自定义图标https://blog.51cto.com/yangfandev/1404925

office功能区添加自定义功能实质上是通XML添加的,这里推荐一个工具方便编辑修改XML文件。
OfficeCustomUIEditorSetup(2010支持中文编辑).rar
OfficeidMsoViewer,本工具用于查看Office内置控件的idMso属性。
OfficeidMsoViewer.zip

二、开始动工

1.启动Excel文件,新建一个Excel文件,另存为xlsm格式,关闭Excel。


查看图示


2.启动Custom UI Editor For Microsoft Office软件,打开刚才保存的Excel文件。

查看图示


3.依次点击Inset-Sample XML-Excel-A Custom Tab

查图示



最终效果


4.保存,双击打开Excel文件查看效果。

查看图示

三、解释

在XML中:
id相当于给每个模块定义的名称,必须唯一不能重复。
label是相应空间在tab上显示的名称。
size控件打开,可以是large和small。
onAction控件点击后执行的事件名称。



1.固定格式部分,用于声明,使用过程中不用修改。

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
    <ribbon>

    </ribbon>
</customUI>



2.Excel上面整个功能区都属于tabs,是tab的集合。开始、插入、页面布局...这些都属于tab。

        <tabs>
            <tab id="customTab" label="Contoso" insertAfterMso="TabHome">

            </tab>
        </tabs>



3.实例中我们插入了一个tab,叫Contoso,在开始tab后面。

<tab id="customTab" label="Contoso" insertAfterMso="TabHome">

</tab>



4.插入6组功能,也就是6个group。其中id为customGroup之中加入了3个按钮。由于版本兼容性问题6个group之中只显示了前3。

                <group idMso="GroupClipboard" />
                <group idMso="GroupFont" />
                <group id="customGroup" label="Contoso Tools">
                    <button id="customButton1" label="ConBold" size="large" onAction="conBoldSub" imageMso="Bold" />
                    <button id="customButton2" label="ConItalic" size="large" onAction="conItalicSub" imageMso="Italic" />
                    <button id="customButton3" label="ConUnderline" size="large" onAction="conUnderlineSub" imageMso="Underline" />
                </group>
                <group idMso="GroupEnterDataAlignment" />
                <group idMso="GroupEnterDataNumber" />
                <group idMso="GroupQuickFormatting" />