2013-06-02 3 views
0

여기에서 하나의 정말 어려운 문제가 있습니다. 우리 부서가 수백만을 구하기 위해서는이 문제를 해결하는 것이 매우 중요합니다 (진심 어린 도움을 깊이 주신 것입니다). 사실 우리는 텍스트 형태로 "격자 선 데이터"라는 두 개의 다른 열을 가지고 있습니다. 예 : GL 23.5-24/G. 여기서 23.5-24는 X 축 방향의 값을 나타내고 G는 Y 축 방향의 값을 나타냅니다. 이 모든 데이터는 하나의 열에 있습니다. 데이터가 단일 값이 아닌 값 조합 인 경우가 있습니다. GL 24-24.7/S-T, GL 25.3-25.5/S-T, 때로는 GL 27/H 27/H.5 26.5/J.5 GL 26.5-27.5/L과 비슷합니다. 이제이 데이터로 작업 할 때 두 가지 큰 문제가 발생했습니다. 먼저이 텍스트 기반 데이터를 유용하고 직접적으로 이해할 수있는 그리드 라인 데이터로 변환해야한다는 것입니다. 즉 GL 24-24.7/ST는 한 셀에서는 24 - 24.7, 다른 셀에서는 24.7과 같아야합니다. 24 - 24.7이 X 축을 따르고 그 반대도 마찬가지입니다. 이 작업을 수행 한 후에이 데이터를 동일한 유형의 데이터, 즉 GL 24.5/S.5를 갖는 다른 열과 비교해야합니다. 비교는 그리드가 주 그리드의 하위 집합으로 분류되는지 아닌지를 알려주는 방식으로 이루어져야합니다. 예 : 23 - 25/R - T와 같이 메인 그리드 선이 있고 두 번째 그리드가 24.5/S이면 확실하게이 두 번째 그리드가 첫 번째 그리드 사이에 떨어집니다.그리드 라인 데이터를 파싱하고 다른 데이터와 비교하여 그리드 범위를 얻으십시오

그럼 전체적인 문제는 유용한 그리드에서 텍스트 데이터를 분리 한 후 다른 첫 번째 그리드 선을 검사하는 것입니다. 나는 전반적인 문자열의 파싱을 얻기 위해서만 스크래치 작업을 조금했지만 더 진행하기 위해 합리적인 알고리즘을 형성 할 수 없었다.

다음은 데이터를 구문 분석하기위한 현재 코드입니다.

Dim strAll() As String 
Dim strSNO() As String, Meesam() As String 
Dim lastRow As Integer, i As Integer, newRng As Range, cnt As Integer, x As String 
Dim a As Integer 

With ThisWorkbook.Sheets("Data") 
lastRow = .Range("A7000").End(xlUp).Row 
ReDim strAll(lastRow) 
Set newRng = .Range("A1:A" & lastRow) 
End With 

For cnt = LBound(strAll()) To UBound(strAll()) 
    strAll(cnt) = newRng.Cells(cnt + 1, 1).Value 
Next 

Do While i < UBound(strAll) 

If (InStr(1, strAll(i), "Element", vbTextCompare) > 0) Then 
    i = i + 2 
    Do Until InStr(1, strAll(50), "+GL", vbTextCompare) > 0 'Loop until line includes "+" 
     Meesam = SplitMultiDelims(strAll(i), "/") 
     a = 0 
     For a = LBound(Meesam) To UBound(Meesam) 
      newRng.Offset(i, a) = Meesam(a) 
     Next 
     i = i + 1 
    Loop 
End If 
i = i + 1 
Loop 
+0

나는 그것이 정말로 복잡한 프로젝트라는 것을 알고있다. 그러나 정말로 그것을 관리 할 수있는 전문가가 많이있다. 나는 전반적인 가이드 라인이 필요하며 직접 프로젝트를 돌볼 것입니다. Thnx –

+0

누군가가 몇 가지 일반적인 생각을 공유 할 수 있다고해도 나는 매우 행복 할 것입니다. 내 생각은 별개의 그리드 데이터를 얻을 수 있도록 ","값을 기반으로 데이터를 구문 분석하는 것입니다. 그 다음에 가장 중요한 것은 B> A 등 어떤 값이 더 높은지를 결정하는 것입니다 (영문자 기준). 이 모든 후 나는 내 비교 목록과 비교할 수있는 몇 가지 비교 기술을 사용할 수 있습니다. –

+0

얘들 아 문제에 대한 완벽한 해결책을 찾았습니다. 최종 해결책을 찾기 위해 거의 한 달이 걸렸습니다. –

답변

0
Function IsInside(Area As String, Rectangle As String) As Boolean 

Dim Parts() As String 
Dim Line1 As String, Line2 As String, Lx1 As Single, Ly1 As Single, Lx2 As String, Ly2 As String 
Dim Rect1 As String, Rect2 As String, Rx1 As Single, Ry1 As Single, Rx2 As String, Ry2 As String 

On Error Resume Next 

Parts = Split(Replace(Area, " ", ""), "/") 
Line1 = Parts(0) 
Line2 = Parts(1) 

If InStr(1, Line1, "-", vbTextCompare) > 0 Then 
Parts = Split(Line1, "-") 
Lx1 = Parts(0) 
Ly1 = Parts(1) 
Else 
Lx1 = Line1 
Ly1 = "0" 
End If 

If InStr(1, Line2, "-", vbTextCompare) > 0 Then 
Parts = Split(Line2, "-") 
Lx2 = Parts(0) 
Ly2 = Parts(1) 
Else 
Lx2 = Line2 
Ly2 = 0 
End If 

Parts = Split(Replace(Rectangle, " ", ""), "/") 
Rect1 = Parts(0) 
Rect2 = Parts(1) 

If InStr(1, Rect1, "-", vbTextCompare) > 0 Then 
Parts = Split(Rect1, "-") 
Rx1 = Parts(0) 
Ry1 = Parts(1) 
Else 
Rx1 = Rect1 
Ry1 = 0 
End If 

If InStr(1, Rect2, "-", vbTextCompare) > 0 Then 
Parts = Split(Rect2, "-") 
Rx2 = Parts(0) 
Ry2 = Parts(1) 
Else 
Rx2 = Rect2 
Ry2 = 0 
End If 

If Lx1 > 0 And Ly1 > 0 And Lx2 > 0 And Ly2 > 0 And Rx1 > 0 And Ry1 > 0 And Rx2 > 0 And Ry2 > 0 Then 
IsInside = Lx1 >= Rx1 And Lx1 <= Ry1 And Lx2 >= Rx2 And Lx2 <= Ry2 
ElseIf Lx1 > 0 And Ly1 = 0 And Lx2 > 0 And Ly2 > 0 And Rx1 > 0 And Ry1 > 0 And Rx2 > 0 And Ry2 > 0 Then 
IsInside = Lx1 >= Rx1 And Lx1 <= Ry1 And Lx2 >= Rx2 And Ly2 <= Ry2 
ElseIf Lx1 > 0 And Ly1 = 0 And Lx2 > 0 And Ly2 = 0 And Rx1 > 0 And Ry1 > 0 And Rx2 > 0 And Ry2 > 0 Then 
IsInside = Lx1 >= Rx1 And Lx1 <= Ry1 And Lx2 >= Rx2 And Lx2 <= Ry2 
ElseIf Lx1 > 0 And Ly1 > 0 And Lx2 > 0 And Ly2 > 0 And Rx1 > 0 And Ry1 = 0 And Rx2 > 0 And Ry2 > 0 Then 
IsInside = 0 
ElseIf Lx1 > 0 And Ly1 = 0 And Lx2 > 0 And Ly2 > 0 And Rx1 > 0 And Ry1 = 0 And Rx2 > 0 And Ry2 > 0 Then 
IsInside = Lx1 = Rx1 And Lx2 >= Rx2 And Ly2 <= Ry2 
ElseIf Lx1 > 0 And Ly1 = 0 And Lx2 > 0 And Ly2 = 0 And Rx1 > 0 And Ry1 = 0 And Rx2 > 0 And Ry2 > 0 Then 
IsInside = Lx1 = Rx1 And Lx2 >= Rx2 And Lx2 <= Ry2 
ElseIf Lx1 > 0 And Ly1 > 0 And Lx2 > 0 And Ly2 > 0 And Rx1 > 0 And Ry1 = 0 And Rx2 > 0 And Ry2 = 0 Then 
IsInside = 0 
ElseIf Lx1 > 0 And Ly1 = 0 And Lx2 > 0 And Ly2 > 0 And Rx1 > 0 And Ry1 = 0 And Rx2 > 0 And Ry2 = 0 Then 
IsInside = 0 
ElseIf Lx1 > 0 And Ly1 = 0 And Lx2 > 0 And Ly2 = 0 And Rx1 > 0 And Ry1 = 0 And Rx2 > 0 And Ry2 = 0 Then 
IsInside = 0 
ElseIf Lx1 > 0 And Ly1 > 0 And Lx2 > 0 And Ly2 > 0 And Rx1 > 0 And Ry1 > 0 And Rx2 > 0 And Ry2 = 0 Then 
IsInside = 0 
ElseIf Lx1 > 0 And Ly1 = 0 And Lx2 > 0 And Ly2 > 0 And Rx1 > 0 And Ry1 > 0 And Rx2 > 0 And Ry2 = 0 Then 
IsInside = 0 
ElseIf Lx1 > 0 And Ly1 = 0 And Lx2 > 0 And Ly2 = 0 And Rx1 > 0 And Ry1 > 0 And Rx2 > 0 And Ry2 = 0 Then 
IsInside = 0 
Else 
End If 

End Function 

그래서 당신은 하나의 셀 그리드 값과 다른 셀과 위에서 언급 한 기능을 사용 (당신이 검색해야하는) 더 큰 사각형의 값을 넣어해야 할 일은.