我在Excel中有一列叫做“职位”。列可以有如下所示的字符串数字
位置
1-5
1-7
1-7
1-8
1-89
2-1
2-12
2-2
2-3
.恩-恩。第一个数字指的是页码,第二个号码,即"-“后面是指页面位置。
该页面从左到右分为9个位置,如下所示:
1 2 3
4 5 6
7 8 9
因此,当位置列中有数字1-8时,它的意思是:
第1页
1 2 3
4 5 6
7 (8) 9
当位置列中有数字2-12时,它的意思是:
第2页
(1) (2) 3
4 5 6
7 8 9
这就是它是如何设计的,但是当我有前面提到的一组位置时,我想要修改的只有在“位置”列中。
位置
1-5
1-7
1-7
1-8
1-89
2-1
2-12
2-2
2-3
.
然后我需要一个公式,以某种方式通知我,位置1-8和1-89会重叠,位置2-1,2-12和2-2也会重叠。当然,位置1-7和1-7将完全重叠,因此这也应该通知用户。我怎么能这么做?
发布于 2016-10-26 10:52:41
由于OP添加了VBA
标记,请尝试此过程。它在相应的Position
中拆分一个3 pieces
,并将它们与列表中的所有其他Positions
进行比较。它假设Positions
列表从B2
开始,并在C
列中列出比较结果。
'These Options declaration always go at the top of the module, class, etc.
Option Explicit
Option Base 1
Sub Get_Overlap()
Const kFlag As String = "Overlapping" 'Change as required
Dim rData As Range, aData As Variant, aResults() As String, sResult As String
Dim lA As Long, sAvalue As String, iAp As Integer, bA1 As Byte, bA2 As Byte
Dim lB As Long, sBvalue As String, iBp As Integer, bB1 As Byte, bB2 As Byte
Rem Sets Data Range & Arrays
With ThisWorkbook.Sheets("TEST").Columns("B") 'Change as required
Set rData = Range(.Cells(2), .Cells(Rows.Count).End(xlUp))
End With
aData = rData.Value2
aData = WorksheetFunction.Transpose(aData)
rData.Offset(0, 1).ClearContents
ReDim Preserve aResults(UBound(aData))
For lA = 1 To UBound(aData)
Rem Initialize & Set Item A Values
sAvalue = Empty: sAvalue = aData(lA)
iAp = 0: iAp = Left(sAvalue, 1)
bA1 = 0: bA1 = Mid(sAvalue, 3, 1)
On Error Resume Next
bA2 = 0: bA2 = Mid(sAvalue, 4, 1)
On Error GoTo 0
For lB = lA + 1 To UBound(aData)
Rem Initialize & Set Item B Values
sBvalue = Empty: sBvalue = aData(lB)
iBp = 0: iBp = Left(sBvalue, 1)
bB1 = 0: bB1 = Mid(sBvalue, 3, 1)
On Error Resume Next
bB2 = 0: bB2 = Mid(sBvalue, 4, 1)
On Error GoTo 0
Rem Initialize Comparison Result
sResult = Empty
Rem Compare Items & Values
Select Case True
Case sAvalue = sBvalue
sResult = kFlag
Case iAp = iBp
Select Case True
Case bA2 = 0 And bB2 = 0
If (bA1 = bB1) Then sResult = kFlag
Case bA2 = 0
If bA1 >= bB1 And bA1 <= bB2 Then sResult = kFlag
Case bB2 = 0
If bB1 >= bA1 And bB1 <= bA2 Then sResult = kFlag
Case Else
If bA1 >= bB1 And bA1 <= bB2 Then
sResult = kFlag
ElseIf bA2 >= bB1 And bA2 <= bB2 Then
sResult = kFlag
ElseIf bB1 >= bA1 And bB1 <= bA2 Then
sResult = kFlag
ElseIf bB2 >= bA1 And bB2 <= bA2 Then
sResult = kFlag
End If
End Select: End Select
Rem Add Results into Array
If sResult <> Empty Then
aResults(lA) = sResult
aResults(lB) = sResult
End If
Next: Next
Rem Enter Comparison Results
'Results will be posted one column to the right of where the List
'This is done by the use of "rData.Offset(0,1)"
rData.Offset(0, 1).Value = WorksheetFunction.Transpose(aResults)
End Sub
建议阅读以下几页,以加深对所使用资源的了解:
选项关键字,变量和常数,带语句,范围对象(Excel),WorksheetFunction对象,For...Next语句,选择Case语句,If...Then...Else语句,论错误陈述,Range.Offset属性(Excel)
https://stackoverflow.com/questions/40240422
复制相似问题