|
>現在はシート1で数字だけにして、setで列を配列変数にセットして、
>Transposeで行列変換して移動している形でした。
では、シート1上でデータの削除を行って善いのですね?
こんなで如何でしょう
Option Explicit
Public Sub Sample3()
Dim i As Long
Dim lngCount As Long
Dim lngRows As Long
Dim lngColumns As Long
Dim rngList As Range
Dim rngResult As Range
Dim vntData As Variant
Dim lngDelete() As Long
Dim strProm As String
'結果を出力する位置すぉ指定
Set rngResult = Worksheets("Sheet2").Cells(1, 1)
'画面更新を停止
Application.ScreenUpdating = False
With Worksheets("Sheet1").UsedRange
'◆Listの先頭セル位置を基準とする
Set rngList = .Cells(1, 1)
'行列数の取得
lngRows = .Rows.Count
lngColumns = .Columns.Count
If .Count = 1 Then
strProm = "データが有りません"
GoTo Wayout
End If
'先頭列の値を配列に取得
vntData = rngList.Resize(lngRows + 1).Value
'削除Flag用の配列を確保
ReDim lngDelete(1 To lngRows, 1 To 1)
End With
With rngList
'先頭列の値が文字列なら削除Flagに1を立てる
For i = 1 To lngRows
'先頭列の値が空白で若しくは、数値で無いなら
If vntData(i, 1) = "" Or (Not IsNumeric(vntData(i, 1))) Then
'Flagに1を立てる
lngDelete(i, 1) = 1
'削除行数をカウント
lngCount = lngCount + 1
End If
Next i
If lngCount > 0 Then
'FlagをL列に出力
.Offset(, lngColumns).Resize(lngRows) = lngDelete
'削除行を最終行に集める為、L列をKeyとして整列
.Resize(lngRows, lngColumns + 1).Sort _
Key1:=.Offset(, lngColumns), Order1:=xlAscending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False, _
Orientation:=xlTopToBottom, SortMethod:=xlStroke
'行を削除
.Offset(lngRows - lngCount).Resize(lngCount).EntireRow.Delete
'Keyを削除
.Offset(, lngColumns).EntireColumn.Delete
End If
End With
With rngResult
If rngList.Resize(lngRows - lngCount, lngColumns).Count > 1 Then
'削除処理を行ったデータをTransposeしてSheet2に貼り付け
.Resize(lngColumns, lngRows - lngCount).Value _
= Application.WorksheetFunction.Transpose(rngList.Resize(lngRows _
- lngCount, lngColumns).Value)
End If
End With
strProm = "処理が完了しました"
Wayout:
'画面更新を再開
Application.ScreenUpdating = True
Set rngList = Nothing
Set rngResult = Nothing
MsgBox strProm, vbInformation
End Sub
|
|