【原创】VBA学习笔记(30)【例子】----VBA--干支纪年

版权声明:一起学习,一起成长,欢迎关注 奔跑的犀牛先生 https://blog.csdn.net/xuemanqianshan/article/details/89137912

dim等声明,其实是只能过程用?

public 只能定义在 过程外,函数外。这里是过程有效级的

数组必须定义 arr(10)是11个数

数组使用 前必须先定义大小,即使动态数组也得redim

而变量却不用   

Sub text()

    Dim a As Byte

    Static b As Byte

    a = a + 1

    b = b + 1

    Debug.Print "a等于" & a

    Debug.Print "b等于" & b

End Sub
这样用居然没问题,a b默认从1开始?

 IIf(expr,   truepart,   falsepart)    

1 之后的改进和备注

天干地支的编码

https://zhidao.baidu.com/question/440519452.html

和把1984甲子作为计算基点的思路很像

   
4 5 6 7 8 9 0 1 2 3    
4 5 6 7 8 9 10 11 0 1 2 3

可以继续研究的点

一个详细的python--包含干支纪年月日的

https://www.jianshu.com/p/8dc0d7ba2c2a

https://www.jianshu.com/p/f268d2033540

2 VBA我自己实现方案1

  • 算法不理解
  • nian -4 为啥?(因为年的尾数4是干支的开头?)
  • mod 60 mod10 能理解
  • 最好写成1个sub,否则还得先运行前面的sub
   
Public arr_tiangan(10)                 'dim arr的居然模块内不能调用?需要public
Public arr_dizhi(12)                   '并且只能放开头,放第1个sub内就报错


Sub dim_ganzhi()                      '如果放2个sub 就得先运行前面的sub
For i = 1 To 10                       '默认下标不是从0开始,写0越界?
    arr_tiangan(i) = Cells(1, i)      'arr从excel里读,这很excel 但有直接定义的简单方法吗?
    Debug.Print (arr_tiangan(i))
Next i


For j = 1 To 12
    arr_dizhi(j) = Cells(2, j)
    Debug.Print (arr_dizhi(j))
Next j

End Sub



Sub ganzhi()                                           '看起来最好写成一个sub
nian = InputBox("请输入一个年份(4位数字):>>>")           '不能用保留字year
tiangan = ((nian - 4) Mod 60) Mod 10 + 1
dizhi = ((nian - 4) Mod 60) Mod 12 + 1               '注意mod60要分开写
MsgBox (nian & "年是" & arr_tiangan(tiangan) & arr_dizhi(dizhi) & "年")   '注意"和&要用空格分开,否则报错

End Sub

VBA试试

不能简单双层循环

应该要找最大公约数,最小公倍数把

把60甲子循环出来?


 

3 参考资料

这个自定义函数挺牛的,很好用

http://club.excelhome.net/thread-1083532-1-1.html

   
0 1 2 3 4 5 6 7 8 9    
0 1 2 3 4 5 6 7 8 9 10 11

'数组怎么读表,是二维表?快速读?
'怎么读为字典呢?


Function YC1(Year&)
    If Year < 0 Then Year = Year + 1 '公元前年份+1调整
    YC = Mid("庚辛壬癸甲乙丙丁戊己", Year Mod 10 + IIf(Year Mod 10 < 0, 11, 1), 1) & _
      Mid("申酉戌亥子丑寅卯辰巳午未", Year Mod 12 + IIf(Year Mod 12 < 0, 13, 1), 1)
End Function

Function YC3(Year&) '皇帝元年公元前2697年
    Year = Year + 2696
    If Year < 0 Then Year = Year + 1
    YC = Mid("甲乙丙丁戊己庚辛壬癸", (Year Mod 10) + 1, 1) _
    & Mid("子丑寅卯辰巳午未申酉戌亥", (Year Mod 12) + 1, 1)
End Function

Function YC2(Year&) '皇帝元年公元前2697年
    If Year = 0 Then YC = "": Exit Function
    If Year < 0 Then Year = 56641 + Year
    YC = Mid("庚辛壬癸甲乙丙丁戊己", (Year Mod 10) + 1, 1) _
    & Mid("申酉戌亥子丑寅卯辰巳午未", (Year Mod 12) + 1, 1)
End Function

这个应该也好用

10天干:庚辛壬癸甲乙丙丁戊己

对其编码:0 1  2 3  4  5 6  7  8 9

12地支:   申酉戌亥子丑寅卯辰巳午未

对其编码:0  1  2 3  4 5  6  7 8  9 10 12

如2014年,取各位数字4,则天干对应编码为甲。

 用12去除2014得余数10,则地支对应编码为午。即,2014为甲午年。
        char TianGan[]={"庚辛壬癸甲乙丙丁戊己"};
    char DiZhi[]={"申酉戌亥子丑寅卯辰巳午未"};
    int year,tg,dz;
    cout<<"请输入年份"<<endl;
    cin>>year;
    tg=year%10;
    dz=year%12;
    string  s1,s2;
    s1.assign(TianGan,tg*2,2);
    s2.assign(DiZhi,dz*2,2);
    cout<<year<<"年是:"<<s1<<""<<s2;

这个对的

y=int(input("请输入公历年份(公元前请加“-”):"))

t=(y-4)%60%10

d=(y-4)%60%12

T=["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"]

D=["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"]

print("{}年为:农历{}{}年".format(y,T[t],D[d]))

这个python的并不好用,可能是因为year在vba是保留字

while 1==1:
    tiangan=['甲','乙','丙','丁','戊','己','庚','辛','壬','癸']
    dizhi=['子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥']
    year=int(input("请输入你要查询的年份:"))
    t=(year%10)-4
    d=(year%12)-4
    print('\n'+'%d年是:'%year+'\n'+tiangan[t]+dizhi[d]+'年'+'\n')

发现好多错误代码

这个错误在于,没理解,干支是60一甲子,并不是天干地支内外层循环,而应该是咬齿轮式的循环

list_tiangan=["甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"]
list_dizhi=["子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"]
list_tiandi=[]
 
for str in list_tiangan:
    for str2 in list_dizhi:
        list_tiandi.append(str+str2)
print(list_tiandi)
 

#include<stdio.h>
void f(int year)
{
    char* x[] = {"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"};
    char* y[] = {"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"};

    int n = year - 1984;

    while(n<0) n += 60;

    printf("%s%s\n", x[n%10], y[n%12]);
}

int main(int argc, char* argv[])
{
    f(1911);
    f(1970);
    f(2012);
    return 0;
}
 

猜你喜欢

转载自blog.csdn.net/xuemanqianshan/article/details/89137912