【原创】VBA(实验5)VBA写干支纪年简单版: 计算阳历年的阴历年份

69 篇文章 20 订阅

什么是天干地支

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

 

方法1:1个特直接特别笨的办法:先写序列再&

  • 直接把天干地支都写成60个循环。
  • 天干*6 复制6份
  • 地支*5 复制5份
  • 然后,两个数组这样对着咬合起来,
  • 剩下的就是把每列的文本组合在一起
  • 但这样的办法感觉很挫
甲子乙丑丙寅丁卯戊辰己巳庚午辛未壬申癸酉甲戌乙亥丙子丁丑戊寅己卯庚辰辛巳壬午癸未甲申乙酉丙戌丁亥戊子己丑庚寅辛卯壬辰癸巳甲午乙未丙申丁酉戊戌己亥庚子辛丑壬寅癸卯甲辰乙巳丙午丁未戊申己酉庚戌辛亥壬子癸丑甲寅乙卯丙辰丁巳戊午己未庚申辛酉壬戌癸亥
Sub ganzhi()
For i = 1 To 60
   Cells(3, i) = Cells(1, i) + Cells(2, i)
Next i
End Sub


 

方法2:用了系统函数lcm,然后自动排出新的2个60的数组行

  • 这个我自己写的
  • 但是还是觉得挺2的
  • 这2个新的60的数组非要写出来吗?不能直接存在数组里? 数组能*2这种倍数吗?python可以的
                                                  
                                                
庚申辛酉壬戌癸亥甲子乙丑丙寅丁卯戊辰己巳庚午辛未壬申癸酉甲戌乙亥丙子丁丑戊寅己卯庚辰辛巳壬午癸未甲申乙酉丙戌丁亥戊子己丑庚寅辛卯壬辰癸巳甲午乙未丙申丁酉戊戌己亥庚子辛丑壬寅癸卯甲辰乙巳丙午丁未戊申己酉庚戌辛亥壬子癸丑甲寅乙卯丙辰丁巳戊午己未
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960

 

Sub ganzhi()


Dim x
Dim arr_tiangan(10)
Dim arr_dizhi(12)
a = 1                          '运算前必须进行定义
b = 1

x = Sheets("ganzhi3").UsedRange
For i = 1 To 10
   arr_tiangan(i) = Cells(1, i)
Next

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

m = Application.Lcm(10, 12)   '取最小公倍数
m_tiangan = m / 10
m_dizhi = m / 12

For i = 1 To m_tiangan
   For j = 1 To 10
     Cells(3, a) = arr_tiangan(j)
     a = a + 1
   Next j
Next i

For i = 1 To m_dizhi
   For j = 1 To 12
     Cells(4, b) = arr_dizhi(j)
     b = b + 1                    '这里如果继续用a a的值会继承下来?!
   Next j
Next i

For i = 1 To 60
   Cells(5, i) = Cells(3, i) + Cells(4, i)
Next

 

思路3:

Sub test_gz()
Dim arr3()
ReDim arr3(1 To 60)
Dim arr10(1 To 60)
Dim arr20(1 To 60)

arr1 = Array("甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸")
arr2 = Array("子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥")
'K = 1
'For Each I In arr1
'    For Each J In arr2
'        arr3(K) = I & J
'        Debug.Print arr3(K)
'        K = K + 1
'    Next
'Next

m = 1
N = 1


For I = 1 To 60 / (UBound(arr1) - LBound(arr1) + 1)
    For J = LBound(arr1) To UBound(arr1)
       arr10(m) = arr1(J)
       m = m + 1
    Next
Next


For I = 1 To 60 / (UBound(arr2) - LBound(arr2) + 1)
    For J = LBound(arr2) To UBound(arr2)
       arr20(N) = arr2(J)
       N = N + 1
    Next
Next


For I = LBound(arr3) To UBound(arr3)
   arr3(I) = arr10(I) + arr20(I)
   Debug.Print arr3(I)
Next




End Sub


 

仿造别人的写的也不对

Sub test_ganzhi()
arr1 = Array("甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸")
arr2 = Array("子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥")


a = ""
K = 0
Do While Not IsNumeric(a)
   a = InputBox("请输入一个纯数字的年份")
   K = K + 1
   If K > 3 Then
      MsgBox "你成心输错的吧!重新运行吧"
   End If
Loop

'If Int(a) - 1984 >= 0 Then
'   b = Int(a) - 1984
'Else
'   c = Abs(Int(a) - 1984) Mod 60
'   b = 60 - c
'End If

Debug.Print arr1(((Int(a) - 4) Mod 60) Mod 10) & arr2(((Int(a) - 4) Mod 60) Mod 12)



End Sub

 

 

 

 

参考,下面的是找到的其他人的写法

 

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

  
0123456789  
01234567891011

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


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;
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值