角度,是我们搞测量这一行无论如何也避不开的,而电子表格EXCEL软件也是我们测量人最爱的计算工具软件之一,如何在EXCEL中输入、输出(显示)角度,这的确是一个看似简单、但又不是那么简单的问题。
先讲角度的表示形式,我们最习惯的还是度分秒的形式,如134°32′45.6″,最直观,要在EXCEL单元格中输入这组数据,没有任何问题,比如我们熟悉的路线直曲表:
.
.
可是,路线直曲表只是个最终的成果表,在大多时候,我们在EXCEL中输入角度并不只是呈现数据,而是需要根据输入的角度进行相关的计算,这些计算大多都涉及三角函数,比如正弦、余弦、正切等。在EXCEL中,所有三角函数计算的角度单位都规定是弧度。这样,就产生这样一个角度转换,我们输入度分秒的角度,在计算时则需要将它们转换成弧度。
在进一步阐述之前,我们先回顾一下EXCEL中两个有关角度转换的函数,一个是RADIANS()函数,另一个是DEGREES()函数,前者是将括号内的度数(十进制的度数,不是度分秒)转换为弧度,后者则是将括号内的弧度转换为度数(十进制)。这两个函数我们不知道使用也没有多大关系,因为我们都知道度和弧度转换系数是:180/π。
再回到前面提到的将输入的度分秒转换成弧度的这个问题,一般的解决方法是两个:
1.将角度(度分秒)按小数形式输入到一个单元格,如133度32分43秒,就输入为133.3243,然后编一个自定义函数,将这个小数中的度、分、秒数字分别提取出来,转换为度,如133度32分43秒就通过“133+32/60+43/3600”这个计算式得到133.5452778度,再使用RADIANS()函数可计算得到弧度;
2.将度、分、秒分别输入到相邻的三个单元格里,并且可以通过定义单元格格式的方式给数字后面附加显示相应的角度单位,以便求得良好的显示效果,再通过类似上述第1点的转换方法计算求得弧度。
前面第一种方式的优点是输入简洁,可以在一个单元格里面一气呵成把度分秒搞定,缺点是小数表示不是很直观,而且需要编程(或者整个函数)把度分秒数字提取出来,第二种方法的优点是角度表现直观,角度转换操作简单,缺点就是要在三个单元格里输入数据,稍显繁琐。
同样,要把角度的计算结果输出显示,通常的做法也不外乎小数形式和度分秒形式,只不过转换过程同前面相反而已。
这两种形式共同的不足在于:输入、输出、计算过程中的角度转换不直接,相当繁琐,一般还需要中间调用几个单元格存储中间结果。
有没有一个能在EXCEL中角度输入、角度显示和角度转换之间找到一个更优、更便捷的方法呢?答案是肯定的。
思路是:利用EXCEL的日期和时间格式。
EXCEL的日期系统是这样定义的:EXCEL为每个日期定义了一个序列号,以1900年1月1日为1,1900年1月2日为2,以此类推,而 2008 年 1 月 1 日的序列号是 39448,简而言之,任何一个日期的数值就是距1900年1月0日(这是个假想的日期)的天数。利用这个特点,我们可以对日期进行加减的运算。比如计算2010年3月4日过56天后的日期,两个日期之间的间隔天数,等等。
再说时间,我们熟知的时间格式是:h:m:s,即:小时:分钟:秒,比如15时23分48秒,就是15:23:48。同日期一样,时间也有数值,以该时间占1天(24小时)的比例作为时间的数值,比如15:23:48的数值是0.641528。
以上过程,可正可逆,通过设定不同的单元格格式,即可将日期(时间)转化为数值,也可将数值转化为日期(时间),并可直接进行加、减等运算操作。
此外,日期和时间可同时输入到一个单元格中,比如“1900/1/3 15:23:48”,日期和时间之间用空格隔开,此时单元格的数值就是日期和时间的总和,即:3. 641528。
为了进一步说明,我们打开EXCEL输入一组数据,体验一下。
如下图所示,我们在第一列输入一组日期时间,分别为:
18:23:34
1900/1/1 0:05:09
1900/1/2 6:30:34
1900/1/3 15:23:48
1900/1/4 22:32:11
图中,后面各列单元格内容均与同一行的第一列单元格数值相同,但相关的格式不一样。分别如下:
第一列:日期格式。日期格式有多种选项,可选择日期带时间的,可以发现,其中时间最多只能显示到分。
第二列:时间格式。我们选择那种以冒号将小时、分、秒隔开的那种。我们发现,同日期格式相比,虽然时间可以显示到秒,但日期缺失,只能显示当天的时间。
.
第三列:数值格式。小数位数我们可以任意设定,这里定为5位小数。这个我们很好理解了,这是日期(时间)的数值。
第四列:自定义格式。我们自定义为:d:hh:mm:ss。其中d表示日期值,h表示小时,m表示分,s表示秒。用两个连续的符号表示强制显示两位数,不足两位以0补足。这种格式可以将日期和时间完整地显示出来。
第五列:自定义格式。我们自定义为:h:mm:ss。这种格式与第二列显示相同,同样无法表示出日期值,小时数只能表达当天的,不大于24。
第六列:自定义格式。我们自定义为:[h]:mm:ss。与第五列格式相比,将小时数用方括号括起来,表示累计小时数。我们可以发现,这时候,小时数体现出了日期值,以每天24小时的标准表示了累计小时数。
第七列:自定义格式。我们自定义为:[h]°mm′ss″。与第六列相比,我们把小时、分、秒之间的冒号分别用度、分、秒符号代替,这样显示出来的数值就具有了我们熟悉的度分秒形式的角度表达方式了。
需要再次强调的是,对于同一行数据,虽然各列显示方式各异,但都具有相同的数值,并都可以直接参与数值计算。当然,我们最有兴趣的是最后一列了,因为在一个单元格中,它具有我们熟悉的度分秒表达方式,而且可以直接参与数值计算。
现在剩下的问题有三个:
第一,输入是不是很麻烦,因为之前是通过诸如“1900/1/4 22:32:11”这样的日期时间方式输入的,如果以后要通过这种方式输入,那会烦死人;
第二,虽然具有象54°30′34″这样的角度表达形式且具有数值可以直接参与计算,它能准确进行角度的数值计算吗,如果需要弧度,又如何转换呢?
第三,部分工程的角度中,秒有保留一位小数或者两位小数的,这种方式能处理吗?
一个一个解决这些问题。
先看输入操作,的确,要把54°30′34″先换算成“1900/1/2 6:30:34”这样的日期再输入进去,确实相当繁琐。现在简洁的输入方式是:将度分秒数字以冒号隔开输入,如输入:“54:30:34”,回车,单元格自动显示为54°30′34″(当然前提是这个单元格的自定义格式[h]°mm′ss″要先设定好),这个问题就算是解决了。
再来看计算,行不行,我们再来几个试验就知道了。在EXCEL中,首先先将相关单元格均自定义为[h]°mm′ss″的格式,然后在角度1和角度2分别输入以下这些角度,然后利用单元格的运算,分别进行“角度1-角度2”、“角度1+角度2”、“角度1×2”这些运算,结果如下:
.
从试验结果可以得出:这种方法完全可以准确进行角度的四则运算。但是依然有两个问题:
1.角度结果为负值时,是无法显示的,但根据进一步的试验可得知,负数结果能够保留并可进行下一步计算;
2.角度大于360度时,无法自动减去360度,这一点和我们习惯不一样,需要编程进行调整,但是如果是中间结果,不会影响三角函数的计算值。
虽然存在以上两个问题,显得没有那么完美,但均是显示问题,不会影响计算,因此没有什么大的关系。
再来说说角度转换,由于小时、分、秒之间均是60进制,跟我们角度的度、分、秒60进制是一致的,这是我们这个方法的理论基础。现在由于单元格的数值其实是“天”的数值,显示的“度”的数值其实是累计的小时数,按照这一关系,现在“度分秒”单元格的数值与实际“度”的关系是24倍关系。找到了这一个关系,与弧度的关系也就迎刃而解了。看下面的这几个表格计算试验:
.
.
反之亦然:
最后关于秒显示的小数位数问题,这个基本不成问题,比如需要把秒设定保留两位小数,只要把自定义格式设定为:[h]°mm′ss.00″即可。下图是相关的几个算例:
.
.
到此,问题基本完全解决。欢迎各位网友提出使用意见和心得。
最后,要感谢湖南路桥建设集团肯尼亚NMT公路改建项目的李坤技术员,是他发给我的一个计算附合导线的EXCEL文件给我以灵感。