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

什么是天干地支

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可以的
                                                                                                   
                                                                                               
庚申 辛酉 壬戌 癸亥 甲子 乙丑 丙寅 丁卯 戊辰 己巳 庚午 辛未 壬申 癸酉 甲戌 乙亥 丙子 丁丑 戊寅 己卯 庚辰 辛巳 壬午 癸未 甲申 乙酉 丙戌 丁亥 戊子 己丑 庚寅 辛卯 壬辰 癸巳 甲午 乙未 丙申 丁酉 戊戌 己亥 庚子 辛丑 壬寅 癸卯 甲辰 乙巳 丙午 丁未 戊申 己酉 庚戌 辛亥 壬子 癸丑 甲寅 乙卯 丙辰 丁巳 戊午 己未
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60

 

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

   
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<<"请输入年份"<     cin>>year;
    tg=year%10;
    dz=year%12;
    string  s1,s2;
    s1.assign(TianGan,tg*2,2);
    s2.assign(DiZhi,dz*2,2);
    cout<

 

这个对的

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

你可能感兴趣的:(VBA,#,VBA实验练习)