Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2249|回复: 6

[已解决]如何将表中的条件公式转化为代码?

[复制链接]
发表于 2009-12-22 10:36 | 显示全部楼层 |阅读模式
各位老师:表中第i列是按照公式=IF()求出的一列值。由于还有其它值需要代码求出,为方便,需要将此公式转变为代码,我自己试着写了一段代码,可输出的结果是错误的,如何写此公式的代码,请各位老师帮帮忙,在此先谢谢了!具体要求见附件。 HpQYpsEN.rar (14.64 KB, 下载次数: 12)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2009-12-22 11:09 | 显示全部楼层    本楼为最佳答案   

P列用不到?
Sub jodzxzhw1() '
    Dim ArrYS, lngRowN&, aa, ArrJG, i&, j%, strLing$, StrChuan$
    Application.ScreenUpdating = False
    aa = Timer
    lngRowN = Sheets("Sheet总表").Range("B65536").End(xlUp).Row
    ArrYS = Sheets("Sheet总表").Range("B3:H" & lngRowN)
    ReDim ArrJG(2 To UBound(ArrYS, 1), 1 To UBound(ArrYS, 2))
    For i = 2 To UBound(ArrYS, 1)
        '生成上一期传字符串
        StrChuan = Join(WorksheetFunction.Index(ArrYS, i - 1, 0))
        '生成上一期临字符串
        strLing = ""
        For j = 1 To UBound(ArrYS, 2)
            If ArrYS(i - 1, j) = 0 Then
                strLing = strLing & 1
            ElseIf ArrYS(i - 1, j) = 9 Then
                strLing = strLing & 8
            Else
                strLing = strLing & ArrYS(i - 1, j) - 1 & ArrYS(i - 1, j) + 1
            End If
            '顺便判断一下本期的传
            If InStr(1, StrChuan, ArrYS(i, j), vbTextCompare) > 0 Then ArrJG(i, j) = "传"
        Next j
        '判断本期
        For j = 1 To UBound(ArrYS, 2)
            If Len(ArrJG(i, j)) = 0 Then
                If InStr(1, strLing, ArrYS(i, j), vbTextCompare) > 0 Then
                    ArrJG(i, j) = "邻"
                Else
                    ArrJG(i, j) = "孤"
                End If
            End If
        Next j
    Next i
    Sheets("Sheet总表").Range("I4").Resize(UBound(ArrJG, 1) - 1, UBound(ArrJG, 2)) = ArrJG
    MsgBox "Done!共" & Format(Timer - aa, "0.0000") & "秒" '记录所用的时间
    Application.ScreenUpdating = True
End Sub
回复

使用道具 举报

 楼主| 发表于 2009-12-22 13:35 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2009-12-22 14:11 | 显示全部楼层

QUOTE:
以下是引用amulee在2009-12-22 11:09:00的发言:
P列用不到?
Sub jodzxzhw1() '
    Dim ArrYS, lngRowN&, aa, ArrJG, i&, j%, strLing$, StrChuan$
    Application.ScreenUpdating = False
    aa = Timer
    lngRowN = Sheets("Sheet总表").Range("B65536").End(xlUp).Row
    ArrYS = Sheets("Sheet总表").Range("B3:H" & lngRowN)
    ReDim ArrJG(2 To
  UBound(ArrYS, 1), 1 To
  UBound(ArrYS, 2))
    For i = 2 To
  UBound(ArrYS, 1)
        '生成上一期传字符串
        StrChuan = Join(WorksheetFunction.Index(ArrYS, i - 1, 0))
        '生成上一期临字符串
        strLing = ""
        For j = 1 To
  UBound(ArrYS, 2)
            If ArrYS(i - 1, j) = 0 Then
                strLing = strLing & 1
            ElseIf ArrYS(i - 1, j) = 9 Then
                strLing = strLing & 8
            Else
                strLing = strLing & ArrYS(i - 1, j) - 1 & ArrYS(i - 1, j) + 1
            End
  If
            '顺便判断一下本期的传
            If InStr(1, StrChuan, ArrYS(i, j), vbTextCompare) > 0 Then ArrJG(i, j) = "传"
        Next j
        '判断本期
        For j = 1 To
  UBound(ArrYS, 2)
            If Len(ArrJG(i, j)) = 0 Then
                If InStr(1, strLing, ArrYS(i, j), vbTextCompare) > 0 Then
                    ArrJG(i, j) = "邻"
                Else
                    ArrJG(i, j) = "孤"
                End
  If
            End
  If
        Next j
    Next i
    Sheets("Sheet总表").Range("I4").Resize(UBound(ArrJG, 1) - 1, UBound(ArrJG, 2)) = ArrJG
    MsgBox "Done!共" & Format(Timer - aa, "0.0000") & "秒" '记录所用的时间
    Application.ScreenUpdating = True
End
  Sub

amulee老师:能否将代码注释一下,有些地方不太明白,麻烦了!

回复

使用道具 举报

发表于 2009-12-22 14:24 | 显示全部楼层

加了点注释,看看可以不?


Sub jodzxzhw1() '
    Dim ArrYS, lngRowN&, aa, ArrJG, i&, j%, strLing$, StrChuan$
    Application.ScreenUpdating = False
    aa = Timer
    lngRowN = Sheets("Sheet总表").Range("B65536").End(xlUp).Row
    '原始数组
    ArrYS = Sheets("Sheet总表").Range("B3:H" & lngRowN)
    '结果数组
    ReDim ArrJG(2 To UBound(ArrYS, 1), 1 To UBound(ArrYS, 2))
    For i = 2 To UBound(ArrYS, 1)
        '生成上一期传字符串。取第i-1行的数组连接成字符串(文本)。
        StrChuan = Join(WorksheetFunction.Index(ArrYS, i - 1, 0))
        '生成上一期邻字符串,用来判断是否邻
        strLing = ""
        For j = 1 To UBound(ArrYS, 2)
            If ArrYS(i - 1, j) = 0 Then '若是0的话邻数只能是1
                strLing = strLing & 1
            ElseIf ArrYS(i - 1, j) = 9 Then '若是9的话邻数只能是8
                strLing = strLing & 8
            Else                        '其他情况邻数是该数加1或者减1
                strLing = strLing & ArrYS(i - 1, j) - 1 & ArrYS(i - 1, j) + 1
            End If
            '顺便判断一下本期的传。看当期的数字是否在上期的传字符串中。
            If InStr(1, StrChuan, ArrYS(i, j), vbTextCompare) > 0 Then ArrJG(i, j) = "传"
        Next j
        '判断本期
        For j = 1 To UBound(ArrYS, 2)
            If Len(ArrJG(i, j)) = 0 Then    '由于传已经判断完毕。剩下若是空的则未判断
                If InStr(1, strLing, ArrYS(i, j), vbTextCompare) > 0 Then   '看当期的数字是否在上期的邻字符串中
                    ArrJG(i, j) = "邻"
                Else            '在邻字符串的就是邻,否则就是孤
                    ArrJG(i, j) = "孤"
                End If
            End If
        Next j
    Next i
    '输出结果
    Sheets("Sheet总表").Range("I4").Resize(UBound(ArrJG, 1) - 1, UBound(ArrJG, 2)) = ArrJG
    MsgBox "Done!共" & Format(Timer - aa, "0.0000") & "秒" '记录所用的时间
    Application.ScreenUpdating = True
End Sub
回复

使用道具 举报

发表于 2009-12-23 05:26 | 显示全部楼层

学习[em02][em02]
回复

使用道具 举报

发表于 2009-12-23 07:36 | 显示全部楼层

QUOTE:
以下是引用amulee在2009-12-22 14:24:00的发言:

加了点注释,看看可以不?


Sub jodzxzhw1() '
    Dim ArrYS, lngRowN&, aa, ArrJG, i&, j%, strLing$, StrChuan$
    Application.ScreenUpdating = False
    aa = Timer
    lngRowN = Sheets("Sheet总表").Range("B65536").End(xlUp).Row
    '原始数组
    ArrYS = Sheets("Sheet总表").Range("B3:H" & lngRowN)
    '结果数组
    ReDim ArrJG(2 To
  UBound(ArrYS, 1), 1 To
  UBound(ArrYS, 2))
    For i = 2 To
  UBound(ArrYS, 1)
        '生成上一期传字符串。取第i-1行的数组连接成字符串(文本)。
        StrChuan = Join(WorksheetFunction.Index(ArrYS, i - 1, 0))
        '生成上一期邻字符串,用来判断是否邻
        strLing = ""
        For j = 1 To
  UBound(ArrYS, 2)
            If ArrYS(i - 1, j) = 0 Then
  '若是0的话邻数只能是1
                strLing = strLing & 1
            ElseIf ArrYS(i - 1, j) = 9 Then
  '若是9的话邻数只能是8
                strLing = strLing & 8
            Else                        '其他情况邻数是该数加1或者减1
                strLing = strLing & ArrYS(i - 1, j) - 1 & ArrYS(i - 1, j) + 1
            End
  If
            '顺便判断一下本期的传。看当期的数字是否在上期的传字符串中。
            If InStr(1, StrChuan, ArrYS(i, j), vbTextCompare) > 0 Then ArrJG(i, j) = "传"
        Next j
        '判断本期
        For j = 1 To
  UBound(ArrYS, 2)
            If Len(ArrJG(i, j)) = 0 Then    '由于传已经判断完毕。剩下若是空的则未判断
                If InStr(1, strLing, ArrYS(i, j), vbTextCompare) > 0 Then   '看当期的数字是否在上期的邻字符串中
                    ArrJG(i, j) = "邻"
                Else            '在邻字符串的就是邻,否则就是孤
                    ArrJG(i, j) = "孤"
                End
  If
            End
  If
        Next j
    Next i
    '输出结果
    Sheets("Sheet总表").Range("I4").Resize(UBound(ArrJG, 1) - 1, UBound(ArrJG, 2)) = ArrJG
    MsgBox "Done!共" & Format(Timer - aa, "0.0000") & "秒" '记录所用的时间
    Application.ScreenUpdating = True
End
  Sub

很好,学习,可惜一些没有标明

[此贴子已经被作者于2009-12-23 7:38:06编辑过]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-6-6 05:01 , Processed in 0.360159 second(s), 6 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表