作者hmsboy (一 身 是 宅)
看板Office
标题[问题] 一个功能 巨集的写法
时间Mon Jun 14 23:26:01 2021
(若是和其他不同软体互动之问题 请记得一并填写)
软体:Excel
版本:2019
是这样的
例如我的巨集写了一些
pro01 = IIf(InStr(1, ch03, "鸡腿饭", 1) <> 0, "PD01", IIf(InStr(1, ch03, "鸡翅
饭", 1) <> 0, "PD02", IIf(InStr(1, ch03, "鸡排饭", 1) <> 0, "PD03", "PD04")))
但是当鸡腿饭下架换成控肉饭
我会打开VBA→取代→目前专案→全部取代
把字串"鸡腿饭"换成"控肉饭"
但是其他使用者 需要修改 不希望让它们打开VBA
所以我想写成 (不知道写法对不对)
pro01 = IIf(InStr(1, ch03, "CPD01", 1) <> 0, "PD01", IIf(InStr(1, ch03,
"CPD02", 1) <> 0, "PD02", IIf(InStr(1, ch03, "CPD03", 1) <> 0, "PD03",
"PD04")))
然後指定本活页簿的工作表1 B2 B3 B4 B5 储存格 设计让使用者填写
这样的话 要如何把储存格内容 引导到VBA内作为程式中的字串
Public CPD01 As String
CPD01 = ActiveWorkbook.Sheets("工作表1").Range("B2")
目前我是想应该写这样
在任何一个空白处 先写这样
但是不知道该如何连结起来
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.239.115.119 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Office/M.1623684365.A.052.html
1F:推 waiter337: 首先我建议你用select case 的写法 06/15 01:38
你是说IIF这条改
Select Case pro01
Case InStr(1, ch03, "鸡腿饭", 1) <> 0
pro01 = "PD01"
Case InStr(1, ch03, "鸡翅饭", 1) <> 0
pro01 = "PD02"
Case InStr(1, ch03, "鸡排饭", 1) <> 0
pro01 = "PD03"
Case Else
pro01 = "PD04"
End Select
2F:→ waiter337: 或者 阵列+回圈判断的写法 06/15 01:38
※ 编辑: hmsboy (36.239.115.119 台湾), 06/15/2021 02:05:27
你可能误会我的意思了 虽然这个方法很好
但是我这个程式写太多了 只好先用取代的
模组1 某段
pro01 = IIf(InStr(1, ch03, "CPD01", 1) <> 0, "PD01","PD02")
模组2
Public CPD01 As String
CPD01 = "鸡腿饭" '原本可以
CPD01 = ActiveWorkbook.Sheets("工作表1").Range("B2") '改这样失败
还是说 "CPD01" 不可以有引号 改 CPD01
※ 编辑: hmsboy (36.239.115.119 台湾), 06/15/2021 02:42:23
4F:推 waiter337: 不可以有引号 引号的意思 就是文字 06/15 02:57
5F:→ waiter337: 两种意思是完全不同 比如 蔡英文 跟"蔡英文" 06/15 02:57
6F:→ waiter337: 两种意思完全不同 前者只是个抽屉 你要放甚麽都可以 06/15 02:58
7F:→ waiter337: 後者铁定就是 辣个人 06/15 02:58
ok 谢谢 我先试看看
有点忘了 整个专案要吃 是写这样对吧
public sub xxx()
CPD01 = ActiveWorkbook.Sheets("工作表1").Range("B2")
end sub
※ 编辑: hmsboy (36.239.115.119 台湾), 06/15/2021 03:18:47
8F:→ waiter337: 这样的意思 只是 cpd01=储存格B2 06/15 03:51
9F:→ waiter337: 可以练习用f8逐行 跟 新增监看式 来看抽屉放什麽 06/15 03:51
10F:→ waiter337: 上网查一查 06/15 03:51
Sub test05()
CPD01 = ActiveWorkbook.Sheets("工作表1").Range("B2").Value
End Sub
滑鼠指着 CPD01 显示 CPD01 = "鸡腿饭"
而我需要 这个新算式时
需要在每一个用到这算式副程式开头插入 Call test05
有办法改成 直接让整个专案都吃到这个算式吗?
※ 编辑: hmsboy (36.239.115.119 台湾), 06/15/2021 04:31:32
11F:推 waiter337: 在sub 以外的地方 输入 06/15 05:01
12F:→ waiter337: sim cpd01 06/15 05:01
13F:→ waiter337: dim cpd01 06/15 05:01
14F:推 waiter337: 最上面 06/15 05:02
如果我用 Public 宣告
宣告完 底下马上写副程式
副程式内的变数 就所有模组同一个变数一样吗
※ 编辑: hmsboy (36.239.115.119 台湾), 06/15/2021 08:40:17
16F:推 waiter337: 只要是不同的程式 要传送变数 只有两种方法 06/15 08:42
17F:→ waiter337: 一种是上面那样 06/15 08:42
18F:→ waiter337: 一种是 呼叫时 要挂号起来带过去 06/15 08:42
20F:→ waiter337: f8 逐行跑看看就会清楚运作流程 06/15 08:45
用 Function 会比较好吗?
模组A
Function CPD(x As String) As String
CPD = x
End Function
模组B
Sub xxxxx()
Dim CPD01 As String
CPD01 = CPD("鸡腿饭")
MsgBox CPD01
End Sub
目前我试到这边
至於
ActiveWorkbook.Sheets("工作表1").Range("B2")
的值我还在想怎麽套进去
※ 编辑: hmsboy (36.239.115.119 台湾), 06/15/2021 09:41:04
21F:→ newacc: 看得好混乱,为什麽不直接把ActiveWorkbook.Sheets.Range 06/15 14:01
22F:→ newacc: 写进你的IIf里? 06/15 14:01
欸 对喔 我试看看
※ 编辑: hmsboy (36.239.115.119 台湾), 06/15/2021 15:15:36
我印象有一个方法是
把某储存格取一个名字 就好像给这个储存格专用身份
然後在VBA直接抓取这个名字
具体上 是怎麽做的?
※ 编辑: hmsboy (36.239.115.119 台湾), 06/15/2021 22:28:48
23F:→ newacc: 定义名称 06/16 01:03