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