高卢鸡 发表于 2019-8-7 23:32

【s1高手如云】excel vba问题请教 12L更新问题

本帖最后由 高卢鸡 于 2020-4-24 00:22 编辑

闲来无事不玩游戏不看片,没事要折腾游戏属性计算,用excel计算。
想实现如下效果:某单元格里存在文字,根据文字判断单元格格式这个可以找到,我也实现了。从下拉选择菜单选择也实现了。

但是目前要实现同一单元格内有不同文字,每个文字独立判断并单独设置每个文字的格式,例如颜色、斜体等。

用条件格式的单元格值包含设定,会把这个单元格的格式统一调整,无法实现每个文字不同格式。

求助s1的excel高手

——————————————8月15日分割线————————————
新需求,装备名里有罗马数字,输入麻烦,如何自动转换成阿拉伯数字。
——————————————2020/04/24分割线———————————
change判断的sub只能写在每一个sheet里么?

可是我有好几个sheet,难道每个sheet都要复制一遍第一段sub么?求助。详见12L




绕指流光 发表于 2019-8-8 10:25

首先说结论:单纯条件格式搞不了,你录个宏按ALT+F11会发现这玩意本身就是作用于range对象的,单元格内的部分字符串没有这个方法或属性
其次可以用VBA直接实现,自己写个sub整个按钮就行,非要下拉菜单那就绑定动作事件

高卢鸡 发表于 2019-8-8 21:04

绕指流光 发表于 2019-8-8 10:25
首先说结论:单纯条件格式搞不了,你录个宏按ALT+F11会发现这玩意本身就是作用于range对象的,单元格内的部 ...

求助大佬,没用过宏,总之条件格式搞不定。怎么写sub按钮呢,我找到了vba的命令,可是不会向你说的弄按钮。
Sub a()
For Each Rng In UsedRange
    For i = 1 To Len(Rng)
      If Mid(Rng, i, 1) = "火" Then
         Rng.Characters(i, 1).Font.Color = vbRed
      End If
    Next i
Next
End Sub

另外这个命令是针对所有单元格的,怎么写可以指针对部分单元格。

绕指流光 发表于 2019-8-9 16:57

高卢鸡 发表于 2019-8-8 21:04
求助大佬,没用过宏,总之条件格式搞不定。怎么写sub按钮呢,我找到了vba的命令,可是不会向你说的弄按钮 ...

首先,没有程序相关知识的话,你先确定为了这个功能能花多少时间,就算是简单的入门,excel的F1也够看很久了,像你说的改变单元格内部分文字的格式,这实际上是改变workbook.sheet.range.cell.character.font的属性,还要一定的逻辑判断,我觉得不是录个宏就能理解的问题,只能告诉你能用vba实现,但自带功能做不到
真有时间研究的话,就找个教程先入门,然后反复录宏吧,vba相对其他语言容易理解的多

—— 来自 smartisan OE106, Android 8.1.0上的 S1Next-鹅版 v2.1.2

高卢鸡 发表于 2019-8-10 22:40

绕指流光 发表于 2019-8-9 16:57
首先,没有程序相关知识的话,你先确定为了这个功能能花多少时间,就算是简单的入门,excel的F1也够看很 ...

如果能当伸手党,当然最好了,没有大佬回答的话,指出了门路我就回去看。反正不是研究excel就是打游戏,都是一样的。

高卢鸡 发表于 2019-8-12 23:34

本帖最后由 高卢鸡 于 2019-8-13 23:41 编辑

最近实在太忙了,每天除了工作,业余时间也有1、2个小时不到,然后就要睡觉了,随便录了2、3个宏看了一下,改了改上文找到的所有单元格搜索改个别文字颜色的代码,可以算是基本达到我的需求了。
Sub text()
Rng.Font.ColorIndex = xlAutomatic
Set Rng =
   For i = 1 To Len(Rng)
      If Mid(Rng, i, 1) = "火" Then
         Rng.Characters(i, 1).Font.color = vbRed
      End If
    Next i

End Sub然后也找到了添加按钮的方法,插入了一个表单控件 按钮。
谢谢大佬指点,@绕指流光

刚刚发现一个问题,如果改了C5的内容比如火、雨、雷,虽然火、雨、雷符合了代码的判断,替换了颜色,但是顿号也会变成上次C5内容中第一个符合判断条件的字的颜色,看来需要在代码前增加一个将字体颜色改为默认的代码。(已修正)
————————8月13日分割线——————————
想着能否在C5内容变化时自动运行代码,搜了一下发现实现很简单。
Private Sub worksheet_change(ByVal target As Range)
    If target.Address = "$C$5" Then
    Call text
    End If
End Sub添加如下代码即可,text就是我上面的sub过程名。其实可以把上面的那么多代码一起放在if。。。then之后。



高卢鸡 发表于 2019-8-15 21:56

【s1高手如云】excel问题请教(转型vba自学分享贴)

前情还是那样,不玩游戏开始研究计算游戏数据。
游戏里有些装备是用罗马数字的。众所周知,不如阿拉伯数字输入方便,所以就想能不能输入阿拉伯数字,然后自动变为罗马数字。
然后就有了最近每天只有一点点能自由用电脑的睡前空闲也要花在上网查资料,vba实验中。
代码如下:

Sub AraToRom()

Set Rng =
    Dim wo As String, Rom As String, Ara As Integer
   
            For i = 1 To Len(Rng)
          If Mid(Rng, i, 1) Like "" Then
             wo = Left(Rng, i - 1)
             Ara = Right(Rng, 1)
             Rom = WorksheetFunction.roman(Ara)
             Range("A2").Value = wo & Rom
          End If
   Next i

End Sub因为装备名还是比较简单,右侧第一个字符为数字,中间没有数字,所以通过for语句找到数字开始的位置,截取前面的字符串,之后转换最后一个数字为罗马数字。最后字符串合并。
还要想想如果数字在前面or在中间,或者有多个不同位置,不同位数的数字,如何都转换。


我的貓 发表于 2019-8-16 00:00

看不明白主楼在说什么。传个excel附件看看。

Bondrewd 发表于 2019-8-16 02:42

其实很多问题都可以转成csv之后拿Python去干,个人感觉比写vba方便一点。

高卢鸡 发表于 2019-8-17 00:06

Bondrewd 发表于 2019-8-16 02:42
其实很多问题都可以转成csv之后拿Python去干,个人感觉比写vba方便一点。

那不就更难了,excel里面有现成的表格,用python还要去先设计一个窗体。
没有超能力,每天工作到死

高卢鸡 发表于 2019-8-17 00:07

我的貓 发表于 2019-8-16 00:00
看不明白主楼在说什么。传个excel附件看看。

试试s1的附件

高卢鸡 发表于 2020-4-24 00:20

闲的无事继续研究excel。松鼠党嘛,肯定有很多资源,最初刻盘,后来改成了屯硬盘。东西多了需要目录,也是从word,到最近整理到excel了。
excel的好处就是可以不按照纸张大小想加多少行列都可以,原来设想还有各种计算和函数可以用(但是好像也用不到)。缺点就是无法直接打印(原来家里有打印机我会打印word保存)。
最初的word只有简单的标签、内容、硬盘sn,到了excel加了型号、sn、剩余空间、购买时间等信息。然后就发现了问题。
我的资源按照animation、movie、music等分类,有好几个sheet。如果剩余空间没有了,我打算给sheet设定颜色,这样下次就不会多一步去点进去看剩余空间,当然有些比较小的资源是可以塞进去的。
本着为了达成一个小的懒惰,却要花大量时间学习搜索的精神,2L的同学已经吐槽过了。初步研究出了vba实现方法。
Sub shttab()
Set Rng =
With ActiveSheet.Tab
   .ColorIndex = -4142
   .TintAndShade = 0
End With
For i = 1 To Len(Rng)
    If Mid(Rng, i, 2) = "已满" Then
      With ActiveSheet.Tab
      .Color = 255
      .TintAndShade = 0
      End With
    End If
Next i

End Sub
设定要判断的单元格F2,然后先把sheet设为无颜色(这步为了配合后面的自动功能),然后for循环查找是否包含“已满”这个字符串,如果有则设定活动的sheet颜色255(红色),否则下一个循环。

之后是想通过判断单元格F2是否变化,自动实现这个功能,参照上次学习的经验
Private Sub Workbook_change(ByVal target As Range)
    If target.Address = "$F$2" Then
    Call shttab
    End If

End Sub只要f2变化,就执行上面的shttab过程。为此还特意在shttab里加入了另一重for循环
For t = 1 To ActiveWorkbook.Worksheets.Count
......
next t后来发觉好像也没啥用。
但是现在发现一个问题。这个判断change的sub只能写到每一个sheet里,如果写到thisworkbook里则没有用。
可是我有好几个sheet,难道每个sheet都要复制一遍第一段sub么?求助。

糊状物 发表于 2020-4-24 01:14

高卢鸡 发表于 2020-4-24 00:20
闲的无事继续研究excel。松鼠党嘛,肯定有很多资源,最初刻盘,后来改成了屯硬盘。东西多了需要目录,也是 ...

虽然只用过几次vba,不过你这f2连个sheet前缀都没有,写到thisworkbook里没效果也太正常了吧。
展示的外循环也太简略了吧。

—— 来自 Xiaomi MI 8, Android 10上的 S1Next-鹅版 v2.0.4-play

sorayang 发表于 2020-4-24 15:30

真有兴致啊...想起几年前一笔笔excel手动记账,现在都懒得去查明细账单了

高卢鸡 发表于 2020-4-24 16:09

糊状物 发表于 2020-4-24 01:14
虽然只用过几次vba,不过你这f2连个sheet前缀都没有,写到thisworkbook里没效果也太正常了吧。
展示的外 ...

因为每个sheet的f2变化都要运行,所以是不是change事件在家一个嵌套循环判断?

—— 来自 Sony G8441, Android 9上的 S1Next-鹅版 v2.1.0-play

糊状物 发表于 2020-4-24 20:19

高卢鸡 发表于 2020-4-24 16:09
因为每个sheet的f2变化都要运行,所以是不是change事件在家一个嵌套循环判断?

—— 来自 Sony G8441, A ...

昨晚在床上没看对,刚刚试了一下你这代码改一个地方是能调用的啊,至于运行正确不正确没有对应的表格我就不知道了。
Private Sub Workbook_change(ByVal target As Range)
改成
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

你插入这类函数不是用excel vb工具的自动生成代码功能的吗?

高卢鸡 发表于 2020-4-24 20:34

本帖最后由 高卢鸡 于 2020-4-24 20:36 编辑

糊状物 发表于 2020-4-24 20:19
昨晚在床上没看对,刚刚试了一下你这代码改一个地方是能调用的啊,至于运行正确不正确没有对应的表格我就 ...
不是的,是上次问题的时候股沟出来的帖子里的做法。

非常感谢,可以达成了,随便改哪个sheet里的f2,就会自动判断


页: [1]
查看完整版本: 【s1高手如云】excel vba问题请教 12L更新问题