|
Hirofumi さん ありがとうございます。
とても感謝しています。
若干手を加えさせて頂きました。
どうしても下記の部分がデバッグで表示されます。
何が考えられるでしょうか
'セル値が数値として入力されている場合
lngFound = DataSearch(CLng(vntDate), rngScope, lngOver)
何卒、ご教授お願いいたします。
Option Explicit
Public Sub 商品()
'日付の先頭位置の前の列(「数量」の見だし位置のA列からのOffset値)
Const clngTop As Long = 2
Dim strPath As String
Dim vntFileName As Variant
Dim dfn As Integer
Dim vntField As Variant
Dim strBuff As String
Dim lngCol As Long
Dim lngRow As Long
Dim rngScope As Range
Dim rngResult As Range
Dim rngDate As Range
Dim strProm As String
Dim fileToOpen As Variant
'Textファイルの有るフォルダを指定
strPath = ThisWorkbook.Path
'「ファイルを開く」ダイアログを表示
If Not GetReadFile(vntFileName, strPath, False) Then
strProm = "マクロがキャンセルされました"
GoTo WayOut
End If
Application.ScreenUpdating = False
'ActiveSheetのA1セルを基準とする(Listの左上隅)
Set rngResult = ActiveSheet.Cells(1, "A") '◎要変更?
With rngResult
'日付の書かれている列数を取得
lngCol = .Offset(, 256 - .Column).End(xlToLeft).Column _
- .Offset(, clngTop).Column
'日付列の範囲を取得
If lngCol > 0 Then
Set rngDate = .Offset(, clngTop + 1).Resize(, lngCol)
End If
'No.が有る行数を取得
lngRow = .Offset(65536 - .Row).End(xlUp).Row - .Row
'No.が有る範囲を取得
If lngRow > 0 Then
Set rngScope = .Offset(1).Resize(lngRow)
End If
End With
'指定されたファイルをOpen
dfn = FreeFile
Open vntFileName For Input As dfn
'ファイルから日付を取得
Do Until EOF(dfn)
'ファイルから1行読み込み
Line Input #dfn, strBuff
'フィールドに分割
vntField = Split(strBuff, ",", , vbBinaryCompare)
'「20050731」形式の日付をシリアル値に変換
vntField(0) = DateValue(Left(vntField(0), 4) _
& "/" & Mid(vntField(0), 5, 2) _
& "/" & Right(vntField(0), 2))
'日付を探索
lngCol = GetDateColumn(vntField(0), rngDate, _
rngResult.Offset(, clngTop)) + clngTop
'No.を探索
lngRow = GetTagNoRow(vntField(5), rngScope, rngResult) 'vntField(5)でOK
'日付、TagNoの交差するセルに値を書き込み
With rngResult.Offset(lngRow, lngCol)
.NumberFormatLocal = "G/標準"
.Value = vntField(6) 'vntField(6)でOK
End With
Loop
Close #dfn
strProm = "処理が完了しました"
WayOut:
Application.ScreenUpdating = True
Set rngScope = Nothing
Set rngDate = Nothing
Set rngResult = Nothing
Beep
MsgBox strProm
End Sub
Private Function GetDateColumn(vntDate As Variant, _
rngScope As Range, _
rngDateTop As Range) As Long
Dim lngFound As Long
Dim lngOver As Long
Dim lngCount As Long
'日付範囲に日付が無いなら
If rngScope Is Nothing Then
lngFound = 0
lngCount = 0
lngOver = 1
Else
'日付の探索
'セル値が数値として入力されている場合
lngFound = DataSearch(CLng(vntDate), rngScope, lngOver)
'セル値が文字列として入力されている場合
' lngFound = DateSearch(vntDate, rngScope, lngOver)
lngCount = rngScope.Columns.Count
End If
'日付が見つかった場合
If lngFound > 0 Then
'位置を返す
GetDateColumn = lngFound
Else
With rngDateTop
'日付が最終列の以内の場合
If lngOver <= lngCount Then
'指定位置に列を挿入
.Offset(, lngOver).EntireColumn.Insert
End If
'日付を書き込み
With .Offset(, lngOver)
.NumberFormatLocal = "m/d"
.Value = vntDate
End With
'挿入位置を返す
GetDateColumn = lngOver
'日付列の範囲を更新
Set rngScope _
= .Offset(, 1).Resize(, lngCount + 1)
End With
End If
End Function
Private Function GetTagNoRow(vntTagNo As Variant, _
rngScope As Range, _
rngListTop As Range) As Long
Dim lngFound As Long
Dim lngOver As Long
Dim lngCount As Long
'商品名範囲に商品名が無いなら
If rngScope Is Nothing Then
lngFound = 0
lngCount = 0
lngOver = 1
Else
'商品名を探索
lngFound = DataSearch(vntTagNo, rngScope, lngOver)
lngCount = rngScope.Rows.Count
End If
'探索成功(商品名が有るなら)
If lngFound > 0 Then
'位置を返す
GetTagNoRow = lngFound
Else
With rngListTop
'挿入位置が行末で無いなら
If lngOver <= lngCount Then
'行を挿入
.Offset(lngOver).EntireRow.Insert
End If
'商品名を書き込み
.Offset(lngOver).Value = vntTagNo
'挿入位置を返す
GetTagNoRow = lngOver
'探索範囲の更新
Set rngScope _
= .Offset(1).Resize(lngCount + 1)
End With
End If
End Function
Private Function DataSearch(vntKey As Variant, _
rngScope As Range, _
Optional lngOver As Long) As Long
Dim vntFind As Variant
'Matchによる二分探索
vntFind = Application.Match(vntKey, rngScope, 1)
lngOver = 1
'もし、エラーで無いなら
If Not IsError(vntFind) Then
'もし、Key値と探索位置の値が等しいなら
If vntKey = rngScope(vntFind).Value Then
'戻り値として、行位置を代入
DataSearch = vntFind
End If
'Key値を超える最小値のある行
lngOver = vntFind + 1
End If
End Function
Private Function GetReadFile(vntFileNames As Variant, _
Optional strFilePath As String, _
Optional blnMultiSel As Boolean _
= False) As Boolean
Dim strFilter As String
ChDrive "C" '修正しました
ChDir "\Program Files\"
'フィルタ文字列を作成
strFilter = "テキスト ファイル (*.txt), *.txt"
'もし、ディフォルトのファイル名が有る場合
If vntFileNames <> "" Then
SendKeys vntFileNames & "{TAB}", False
End If
'「ファイルを開く」ダイアログを表示
vntFileNames _
= Application.GetOpenFilename(strFilter, 2, , , blnMultiSel)
If VarType(vntFileNames) = vbBoolean Then
Exit Function
End If
GetReadFile = True
End Function
|
|