Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2390|回复: 5

[已解决]取XY坐标大小值

[复制链接]
发表于 2013-6-21 22:36 | 显示全部楼层 |阅读模式
A列数据源%上有带T数据全部删除,用C2&D2合并数据代替。
在%下,保留T1,找出坐标X最大,最小,Y最大,最小值,和M30,其他删除。有含有G85双坐标不计算,如A23,A24,不是坐标不计算如A26''M97,*", 计算坐标大小时,一定按6位数计算,要不结果不对,如A11,后面不加0,就不是Y最大,最后结果如B列,谢谢!!!

最佳答案
2013-6-22 21:11
  1. Sub arr2()
  2.     Dim arr(), arrResult(1 To 9, 1 To 1)
  3.     Dim lLastRow&
  4.     Dim i As Long
  5.     Dim strTemp As String
  6.     Dim arrTemp, xTemp As String, yTemp As String
  7.     Dim lMin As Long, lMax As Long
  8.     Dim objDicX As Object, objDicY As Object

  9.     Set objDicX = CreateObject("scripting.dictionary")
  10.     Set objDicY = CreateObject("scripting.dictionary")

  11.     lLastRow = Cells(Rows.Count, 1).End(xlUp).Row
  12.     arr = Range("a1:a" & lLastRow).Value
  13.     arrResult(1, 1) = arr(1, 1)
  14.     arrResult(9, 1) = "M30"
  15.     arrResult(2, 1) = [c2].Value & [d2].Value
  16.     arrResult(3, 1) = "%"
  17.     arrResult(4, 1) = "T1"
  18.     Do
  19.         i = i + 1
  20.     Loop Until arr(i, 1) = "%"
  21.     Do While arr(i, 1) <> "M30" And i <= UBound(arr)
  22.         If Not arr(i, 1) Like "*G85*" Then
  23.             strTemp = arr(i, 1)
  24.             If strTemp Like "X*Y*" Then
  25.                 xTemp = Mid(strTemp, 2, InStr(strTemp, "Y") - 1)

  26.                 If Left(xTemp, 1) = "-" Then
  27.                     xTemp = Left(xTemp & "000000", 7)
  28.                 Else
  29.                     xTemp = Left(xTemp & "000000", 6)
  30.                 End If

  31.                 yTemp = Mid(strTemp, InStr(strTemp, "Y") + 1)
  32.                 If Left(yTemp, 1) = "-" Then
  33.                     yTemp = Left(yTemp & "000000", 7)
  34.                 Else
  35.                     yTemp = Left(yTemp & "000000", 6)
  36.                 End If
  37.                 objDicX(xTemp) = strTemp
  38.                 objDicY(yTemp) = strTemp
  39.             End If
  40.         End If
  41.         i = i + 1
  42.     Loop
  43.    
  44.     'X值最大小值
  45.     If objDicX.Count Then
  46.         arrTemp = objDicX.keys
  47.         For i = LBound(arrTemp) To UBound(arrTemp)
  48.             arrTemp(i) = Val(arrTemp(i))
  49.         Next

  50.         lMin = WorksheetFunction.Match(WorksheetFunction.Min(arrTemp), arrTemp, False)
  51.         lMax = WorksheetFunction.Match(WorksheetFunction.Max(arrTemp), arrTemp, False)
  52.         arrTemp = objDicX.keys
  53.         arrResult(5, 1) = objDicX(arrTemp(lMin - 1))
  54.         arrResult(6, 1) = objDicX(arrTemp(lMax - 1))
  55.     End If
  56.    
  57.     'Y值最大小值
  58.     If objDicY.Count Then
  59.         arrTemp = objDicY.keys
  60.         For i = LBound(arrTemp) To UBound(arrTemp)
  61.             arrTemp(i) = Val(arrTemp(i))
  62.         Next
  63.         
  64.         lMin = WorksheetFunction.Match(WorksheetFunction.Min(arrTemp), arrTemp, False)
  65.         lMax = WorksheetFunction.Match(WorksheetFunction.Max(arrTemp), arrTemp, False)
  66.         arrTemp = objDicY.keys
  67.         arrResult(7, 1) = objDicY(arrTemp(lMin - 1))
  68.         arrResult(8, 1) = objDicY(arrTemp(lMax - 1))

  69.     End If
  70.     Range("e1").Resize(UBound(arrResult), 1).Value = arrResult
  71. End Sub
复制代码

取XY坐标大小值.rar

9.57 KB, 下载次数: 8

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2013-6-22 20:49 | 显示全部楼层
回复

使用道具 举报

发表于 2013-6-22 20:54 | 显示全部楼层
X,Y值都是数字不足6位在后面补0么?
回复

使用道具 举报

发表于 2013-6-22 21:11 | 显示全部楼层    本楼为最佳答案   
  1. Sub arr2()
  2.     Dim arr(), arrResult(1 To 9, 1 To 1)
  3.     Dim lLastRow&
  4.     Dim i As Long
  5.     Dim strTemp As String
  6.     Dim arrTemp, xTemp As String, yTemp As String
  7.     Dim lMin As Long, lMax As Long
  8.     Dim objDicX As Object, objDicY As Object

  9.     Set objDicX = CreateObject("scripting.dictionary")
  10.     Set objDicY = CreateObject("scripting.dictionary")

  11.     lLastRow = Cells(Rows.Count, 1).End(xlUp).Row
  12.     arr = Range("a1:a" & lLastRow).Value
  13.     arrResult(1, 1) = arr(1, 1)
  14.     arrResult(9, 1) = "M30"
  15.     arrResult(2, 1) = [c2].Value & [d2].Value
  16.     arrResult(3, 1) = "%"
  17.     arrResult(4, 1) = "T1"
  18.     Do
  19.         i = i + 1
  20.     Loop Until arr(i, 1) = "%"
  21.     Do While arr(i, 1) <> "M30" And i <= UBound(arr)
  22.         If Not arr(i, 1) Like "*G85*" Then
  23.             strTemp = arr(i, 1)
  24.             If strTemp Like "X*Y*" Then
  25.                 xTemp = Mid(strTemp, 2, InStr(strTemp, "Y") - 1)

  26.                 If Left(xTemp, 1) = "-" Then
  27.                     xTemp = Left(xTemp & "000000", 7)
  28.                 Else
  29.                     xTemp = Left(xTemp & "000000", 6)
  30.                 End If

  31.                 yTemp = Mid(strTemp, InStr(strTemp, "Y") + 1)
  32.                 If Left(yTemp, 1) = "-" Then
  33.                     yTemp = Left(yTemp & "000000", 7)
  34.                 Else
  35.                     yTemp = Left(yTemp & "000000", 6)
  36.                 End If
  37.                 objDicX(xTemp) = strTemp
  38.                 objDicY(yTemp) = strTemp
  39.             End If
  40.         End If
  41.         i = i + 1
  42.     Loop
  43.    
  44.     'X值最大小值
  45.     If objDicX.Count Then
  46.         arrTemp = objDicX.keys
  47.         For i = LBound(arrTemp) To UBound(arrTemp)
  48.             arrTemp(i) = Val(arrTemp(i))
  49.         Next

  50.         lMin = WorksheetFunction.Match(WorksheetFunction.Min(arrTemp), arrTemp, False)
  51.         lMax = WorksheetFunction.Match(WorksheetFunction.Max(arrTemp), arrTemp, False)
  52.         arrTemp = objDicX.keys
  53.         arrResult(5, 1) = objDicX(arrTemp(lMin - 1))
  54.         arrResult(6, 1) = objDicX(arrTemp(lMax - 1))
  55.     End If
  56.    
  57.     'Y值最大小值
  58.     If objDicY.Count Then
  59.         arrTemp = objDicY.keys
  60.         For i = LBound(arrTemp) To UBound(arrTemp)
  61.             arrTemp(i) = Val(arrTemp(i))
  62.         Next
  63.         
  64.         lMin = WorksheetFunction.Match(WorksheetFunction.Min(arrTemp), arrTemp, False)
  65.         lMax = WorksheetFunction.Match(WorksheetFunction.Max(arrTemp), arrTemp, False)
  66.         arrTemp = objDicY.keys
  67.         arrResult(7, 1) = objDicY(arrTemp(lMin - 1))
  68.         arrResult(8, 1) = objDicY(arrTemp(lMax - 1))

  69.     End If
  70.     Range("e1").Resize(UBound(arrResult), 1).Value = arrResult
  71. End Sub
复制代码

评分

参与人数 1 +3 收起 理由
fangniuji + 3 很给力!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2013-6-22 21:28 | 显示全部楼层
hwc2ycy 发表于 2013-6-22 20:54
X,Y值都是数字不足6位在后面补0么?


是的,谢谢!!!
=IF(A2="","",MID(A2,2,FIND("Y",A2)-2)&REPT("0",8-FIND("Y",A2)+(MID(A2,2,1)="-")))
=IF(A2="","",LEFT(REPLACE(A2,1,FIND("Y",A2),)&"000000",6+ISNUMBER(FIND("Y-",A2))))
我的提取坐标公式

回复

使用道具 举报

 楼主| 发表于 2013-6-22 22:07 | 显示全部楼层
fangniuji 发表于 2013-6-22 21:28
是的,谢谢!!!
=IF(A2="","",MID(A2,2,FIND("Y",A2)-2)&REPT("0",8-FIND("Y",A2)+(MID(A2,2,1)="-" ...

如果条件变一下查找:X最小Y最小,X最大Y最小,Y最大X最小,Y最大X最大,谢谢!!!不胜感激,谢谢!!!如何改谢谢。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-26 19:02 , Processed in 0.175391 second(s), 15 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表