|
抛弃你所有的公式吧:
- Sub Test()
- GetValByStr "12345678", Sheet1, "M", 3, Sheet2, "L", 3, 8
- End Sub
- '从shSource表的strStartCol列第lngStartRowID行开始
- '读取lngCols列的数据
- '按strVal指定的顺序
- '填充到shResult表,从strColID列第lngRowID开始填充
- '**如果lngRows为0,将以strStartCol列的最大非空行为界
- Function GetValByStr(strVal As String, _
- shResult As Worksheet, strColID As String, lngRowID As Long, _
- shSource As Worksheet, strStartCol As String, lngStartRowID As Long, lngCols As Long, Optional lngRows As Long = 0)
- Dim arrData As Variant, lngID As Long
- Dim rgArea As Range, arrID As Variant
- Dim lngLen As Long, lngTmp As Long
-
- strVal = Trim(strVal)
- If strVal = "" Then
- MsgBox "输入的顺序为空!"
- Exit Function
- End If
-
- lngLen = Len(strVal)
- ReDim arrID(1 To lngLen) As Long
- '逐个解析顺序串
- For lngID = 1 To lngLen
- lngTmp = CLng(Val(Mid(strVal, lngID, 1)))
- If lngTmp = 0 Or lngTmp > lngCols Then
- MsgBox "顺序串中的顺序号超过最大列号!"
- Exit Function
- Else
- arrID(lngID) = lngTmp
- End If
- Next
-
- '如果lngRows为0,读取strStartCol列的最后一行
- If lngRows = 0 Then
- lngRows = shSource.Range(strStartCol & Rows.Count).End(xlUp).Row
- End If
- If lngRows < lngStartRowID Then
- MsgBox "源区域有效数据不足!"
- Exit Function
- End If
-
- Set rgArea = shSource.Range(strStartCol & lngStartRowID & ":" & strStartCol & lngRows)
-
- ReDim arrData(1 To lngCols) As Variant
- For lngID = 1 To lngCols
- arrData(lngID) = rgArea.Offset(, lngID - 1)
- Next
-
- '清空要填充的区域
- shResult.Range(strColID & lngRowID).Resize(lngRows, lngLen).ClearContents
- '按顺序逐列填充
- For lngID = 1 To lngLen
- shResult.Range(strColID & lngRowID).Offset(0, lngID - 1).Resize(lngRows, 1) = arrData(arrID(lngID))
- Next
-
- MsgBox "OK"
- End Function
复制代码 |
|