纯粹数学问题,不难:Option Explicit'按行减 '事先从Excel中读取第一行,并保存Excel表中第一行A、B、C、D、E、F各列的数据,如果是文本,自己转换成长整型 Dim ExcelData(1 To 6) As LongPrivate Sub Command1_Click() Dim i%, j%, Data& For i = 1 To 6 For j = 1 To 6 If (ExcelData(i) <> 0) And (ExcelData(j) <> 0) And (ExcelData(i) <> ExcelData(j)) Then '不能自己减自己,也不能都为0 Data = ExcelData(i) - ExcelData(j) If Abs(Data) = 1 Or Data = 0 Then '两两相减结果为0,1,-1输出结果 MsgBox ("ExcelData(" & i & ")=" & ExcelData(i) & " ExcelData(" & j & ")=" & ExcelData(j)) Exit Sub End If Else '''''''' End If Next Next End Sub
错了,错了: If (ExcelData(i) <> 0) And (ExcelData(j) <> 0) And (ExcelData(i) <> ExcelData(j)) Then '不能自己减自己,也不能都为0改为: If (ExcelData(i) <> 0) And (ExcelData(j) <> 0) And i <>j Then '不能自己减自己,也不能都为0
13楼的代码会重复计算吧,而且 If (ExcelData(i) <> 0) And (ExcelData(j) <> 0) And (ExcelData(i) <> ExcelData(j)) Then 不能减自己应该是i <> i吧For i = 1 To 5 For j = i+1 To 6 这样可以不用判断是否重复或自减If Abs(Data) = 1 Or Data = 0 Then 可以改成 Abs(Data)<=1
i<>j 我已经在15楼改了。当时我就发现了! For i=1 To 5 For j=i+1 To 6 这样可以不用判断是否重复或自减。这个你说对了! If Abs(Data)=1 Or Data=0 Then 可以改成 Abs(Data) <=1 这个你错了! Abs(Data)=1 Or Data=0和Abs(Data)<=1是两回事 人家只要两两相减结果为0,1,-1的就输出;而Abs(Data)<=1,两两相减,结果可以为0.5,-0.5吧,还不止!!!
我又看了一下代码,其实你说的也有道理。单纯就整型来看:Abs(Data)=1 Or Data=0和Abs(Data)<=1的确是一回事。我这里少说了一句话,Excel数据类型楼主可以改,一旦计算的代码成型后可以不必修改,这样适用范围宽一些!这样就只能用:Abs(Data)=1 Or Data=0
不知道楼主到底是要哪个减哪个。
其实最简单的方法是直接在EXCEL中添加一列或多列,在这添加的列中添加一个减法表达式,然后程序只需要关心这几列就可以了。
abcdef,两两互减,类似握手,只要差1以内就返回
若两列都为空,则不返回但是问题来了,一列为空一列不为空怎么办?
差大于1怎么办?返不返回?我又请来了周正龙的年画,研究了半天,我想楼主的意思应该是这样
abcdef,两两互减,若两者都不为空且差在1以内,就返回True,否则就返回False
'事先从Excel中读取第一行,并保存Excel表中第一行A、B、C、D、E、F各列的数据,如果是文本,自己转换成长整型
Dim ExcelData(1 To 6) As LongPrivate Sub Command1_Click()
Dim i%, j%, Data&
For i = 1 To 6
For j = 1 To 6
If (ExcelData(i) <> 0) And (ExcelData(j) <> 0) And (ExcelData(i) <> ExcelData(j)) Then '不能自己减自己,也不能都为0
Data = ExcelData(i) - ExcelData(j)
If Abs(Data) = 1 Or Data = 0 Then '两两相减结果为0,1,-1输出结果
MsgBox ("ExcelData(" & i & ")=" & ExcelData(i) & " ExcelData(" & j & ")=" & ExcelData(j))
Exit Sub
End If
Else
''''''''
End If
Next
Next
End Sub
从Excel表中分别读取第一行到最后一行的数据,每读取一行都保存到ExcelData数组中,并用上面代码处理,楼主应该算会了吧!
If (ExcelData(i) <> 0) And (ExcelData(j) <> 0) And (ExcelData(i) <> ExcelData(j)) Then '不能自己减自己,也不能都为0改为:
If (ExcelData(i) <> 0) And (ExcelData(j) <> 0) And i <>j Then '不能自己减自己,也不能都为0
If (ExcelData(i) <> 0) And (ExcelData(j) <> 0) And (ExcelData(i) <> ExcelData(j)) Then
不能减自己应该是i <> i吧For i = 1 To 5
For j = i+1 To 6
这样可以不用判断是否重复或自减If Abs(Data) = 1 Or Data = 0 Then
可以改成 Abs(Data)<=1
For i=1 To 5
For j=i+1 To 6
这样可以不用判断是否重复或自减。这个你说对了!
If Abs(Data)=1 Or Data=0 Then
可以改成 Abs(Data) <=1 这个你错了!
Abs(Data)=1 Or Data=0和Abs(Data)<=1是两回事
人家只要两两相减结果为0,1,-1的就输出;而Abs(Data)<=1,两两相减,结果可以为0.5,-0.5吧,还不止!!!
我又看了一下代码,其实你说的也有道理。单纯就整型来看:Abs(Data)=1 Or Data=0和Abs(Data)<=1的确是一回事。我这里少说了一句话,Excel数据类型楼主可以改,一旦计算的代码成型后可以不必修改,这样适用范围宽一些!这样就只能用:Abs(Data)=1 Or Data=0
CI BCCH TCH1 TCH2 TCH3 TCH4 TCH5 TCH6 TCH7 TCH8 TCH9 TCH10 TCH11
14001 6 37 51
14002 30 61 92
14003 19 81 79
14031 3 34 64 80
14032 13 44 70 85 41 30 67 5
14033 23 60 54 90
14061 5 31 49 67
14312 15 37
14312 CBCCH 58 72
CI BCCH , TCH1 ,TCH2 ,TCH3 ,TCH4 ,TCH5 ,TCH6 ,TCH7 ,TCH8 ,TCH9 ,TCH10 ,TCH11
14001 , 6 , 37 ,51
14002 , 30 , 61 ,92
14003 , 19 , 81 ,79
14031 , 3 , 34 ,64 ,80
14032 , 13 , 44 ,70 ,85 ,41 ,30 ,67 ,5
14033 , 23 , 60 ,54 ,90
14061 , 5 , 31 ,49 ,67
14312 , 15 , 37
14312 , CBCCH , 58 ,72
14001 6 37 51
14002 30 61 92
14003 19 81 79
14031 3 34 64 80
14032 13 44 70 85 41 30 67 5
14033 23 60 54 90
14061 5 31 49 67
14062 21 37 55 71 82 91
14063 13 75 43 61 84 93
任意2列相减,在13楼基础上的For i = 1 To 6 的外面再加一个循环,有N行就循环N次,这完全符合你的要求!