Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


8328 / 13646 ツリー ←次へ | 前へ→

【34003】デキストデータの取込み時、条件にて必要データのみを読む込むには? まさ〜る 06/1/24(火) 20:12 質問[未読]
【34007】Re:デキストデータの取込み時、条件にて必... inoue 06/1/24(火) 21:50 発言[未読]
【34009】Re:デキストデータの取込み時、条件にて必... まさ〜る 06/1/24(火) 22:09 質問[未読]
【34010】Re:デキストデータの取込み時、条件にて必... inoue 06/1/24(火) 22:18 発言[未読]
【34011】Re:デキストデータの取込み時、条件にて必... まさ〜る 06/1/24(火) 22:44 質問[未読]
【34014】Re:デキストデータの取込み時、条件にて必... inoue 06/1/25(水) 0:10 発言[未読]

【34003】デキストデータの取込み時、条件にて必要...
質問  まさ〜る  - 06/1/24(火) 20:12 -

引用なし
パスワード
   いつもお世話になります。

上記について、テキストデータをエクセルにインポートする際に不要な行を省いて
処理したいと思うのですが、可能ですか?

インポートした際に、削除するのも出来るのですが、
何分データが多い為、自動処理を考えております。

そこで分かる方おりましたら、ご教授下さい。

A列が 注文No B列 台数として
注文NoがF1最後の注文NOから数えて30件分(固定)を削除して、読込みたい
※読み込み件数を数えながら条件でスキップさせるような判断をいれるには?
例)
   A列   B列 
1  F1-001 1
1  F1-002 1
1  F1-003 1
1  F1-004 1
1  F1-005 1
1  F1-006 1
1  F1-007 1
1  F1-008 1

1300 F4-001 1

以上、説明べたですみませんが、宜しくお願い致します。

【34007】Re:デキストデータの取込み時、条件にて...
発言  inoue E-MAILWEB  - 06/1/24(火) 21:50 -

引用なし
パスワード
   http://www2.moug.net/bbs/exvba/20060124000026.htm
ここでヒントは差し上げましたが1からやり直しですか?
何も進んでいないのですか?

【34009】Re:デキストデータの取込み時、条件にて...
質問  まさ〜る  - 06/1/24(火) 22:09 -

引用なし
パスワード
   ▼inoue さん:
>ここでヒントは差し上げましたが1からやり直しですか?
>何も進んでいないのですか?
お世話になります。
一応できるところまでやってみましたが、できればご教授下さい。

マクロを記録したりして、下記のところまで、テキストをインポートできましたが、
F1という注文NOの最後の場所から30台分のF1の注文No分を省く部分をどういれて
よいかわかりかねております。
すみませんが、よろしくお願い致します。

Sub インポート()  'データインプット

' データのインポート Macro

  
  Dim OpenFile As String
  Dim TBL() As Long, DataCnt As Long, STRow As Long
  Dim ReadDete As String, DData As Variant
  OpenFile = Application.GetOpenFilename("テキストファイル (*.txt;*.dat),   *.txt;*.dat")
  If OpenFile = "False" Then
    End
  End If
  Stime = Now()          '現時点
  Open OpenFile For Input As #1  '1レコード毎読込み
  Line Input #1, ReadDete     '読込んだレコードをReadDeteに保存
  DataCnt = DataCnt + 1      '最終行を検索
  Do Until EOF(1)
    Line Input #1, DData
    DataCnt = DataCnt + 1
  Loop
  Close #1
  CNT = 0: WFlg = 0
  Range("A1000").Value = ReadDete  '1レコードの長さを計測し貼り付け保存
  For i = 1 To Len(ReadDete)
    Range("A3").Value = Mid(ReadDete, i, 1)
    If Mid(ReadDete, i, 1) = "," And (WFlg = 0 Or WFlg = 2) Then
      CNT = CNT + 1
      ReDim Preserve TBL(1 To CNT)
      If WFlg = 0 Then
       TBL(CNT) = 1
      Else
       TBL(CNT) = 2
      End If
      WFlg = 0
      カンマ数 = カンマ数 + 1
    ElseIf Mid(ReadDete, i, 1) = Chr(34) And WFlg = 0 Then
      WFlg = 1
    ElseIf Mid(ReadDete, i, 1) = Chr(34) And WFlg = 1 Then
      WFlg = 2
    ElseIf Mid(ReadDete, i, 1) = "," And WFlg = 2 Then
      WFlg = 0
      カンマ数 = カンマ数 + 1
    ElseIf i = Len(ReadDete) Then
      CNT = CNT + 1
      ReDim Preserve TBL(1 To CNT)
      TBL(CNT) = 1
    End If
  Next
 
  Range("B2").Resize(, カンマ数 + 1).Value = TBL
 
  STAdd = StartAddSet
 
  huhu = Range(STAdd).Row
  popo = (Range(STAdd).Row + DataCnt - 1)
  yuio = Cells.Rows.Count - (Range(STAdd).Row + DataCnt - 1)
  STRow = 1
  If DataCnt > Cells.Rows.Count * 2 Then
    MsgBox DataCnt & "以上は、このマクロでは無理です。"
    End
  ElseIf Cells.Rows.Count - (Range(STAdd).Row + DataCnt - 1) >= 0 Then
    LPC = 1
  Else
    Ag = (Range(STAdd).Row + DataCnt) - Rows.Count
    LPC = 2
  End If
  
  'End
 
  For i = 1 To LPC                   
With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & OpenFile, _
       Destination:=Range(STAdd))
    .TextFilePlatform = xlWindows
    .TextFileStartRow = 1
    .TextFileParseType = xlFixedWidth
    .TextFileTextQualifier = xlTextQualifierDoubleQuote
    .TextFileConsecutiveDelimiter = False
    .TextFileTabDelimiter = True
    .TextFileSemicolonDelimiter = False
    .TextFileCommaDelimiter = False
    .TextFileSpaceDelimiter = False
    .TextFileColumnDataTypes = Array(1, 1, 1, 1, 9, 9, 9, 9, 9, 1, 9) '2は文字列、1は標準、9は削除
    .TextFileFixedColumnWidths = Array(9, 6, 2, 10, 16, 22, 15, 10, 10, 6)   'セルの幅
    .Refresh BackgroundQuery:=False
    End With
    If LPC = 2 And i = 1 Then
      '3537
      'STRow = DataCnt - (Range(STAdd).Row + DataCnt - 1) - Rows.Count
      STRow = Rows.Count - Range(STAdd).Row + 1
      AcShNam = ActiveSheet.Name
      Worksheets.Add(After:=ActiveSheet).Name = AcShNam & "-2"
      Application.DisplayAlerts = False
    End If
  Next
  Application.DisplayAlerts = True
  Erase TBL
End Sub

【34010】Re:デキストデータの取込み時、条件にて...
発言  inoue E-MAILWEB  - 06/1/24(火) 22:18 -

引用なし
パスワード
   >一応できるところまでやってみましたが....
では、提示のコードのどの部分が何をやっているのか説明して下さい。
私が申し上げたアプローチとは全く違うようなので、
説明がないと分かりません。

【34011】Re:デキストデータの取込み時、条件にて...
質問  まさ〜る  - 06/1/24(火) 22:44 -

引用なし
パスワード
   >では、提示のコードのどの部分が何をやっているのか説明して下さい。
>私が申し上げたアプローチとは全く違うようなので、
>説明がないと分かりません。
すみません。説明不足で。・・・・何から何まですみません。説明べたで。・・・

コードを一つ一つ説明すると長くなりそうなので、端的に申しますと、
OpenFileにてテキストファイルを開き、ReadDeteに1レコード長を保存し、
最終行までそれをおこなったあと、セルA1000番地にそれを貼りつけておきます。
それから、取りこんだテキストデータの必要な列だけをシートに貼りつけておりますが、

必要な行だけを逆に取りこもうとすると、難しいのですか?

それとも1レコードずつ、読込ませる際、IFにてF1の最終番号を取得し、そこから
上に30行分DELETEするようなコードにすればよいのですか?

【34014】Re:デキストデータの取込み時、条件にて...
発言  inoue E-MAILWEB  - 06/1/25(水) 0:10 -

引用なし
パスワード
   >コードを一つ一つ説明すると長くなりそうなので、端的に申しますと、
長いコードを提示したのだから説明だけ「端的」では分かりません。

>OpenFileにてテキストファイルを開き、ReadDeteに1レコード長を保存し、
>最終行までそれをおこなったあと、セルA1000番地にそれを貼りつけておきます。
「最終行までそれをおこなったあと」はなぜ?
A1000番地に貼ったのは先頭レコードでしょう?
それに「A1000番地」は何の役割ですか?

>それから、取りこんだテキストデータの必要な列だけをシートに貼りつけておりますが、
>必要な行だけを逆に取りこもうとすると、難しいのですか?
QueryTablesでテキストを読むことは私はやらないので良く知りません。
でもそれ以前にやっている「空読み」が何をやっているのか分からないし、
未宣言変数も、
  Dim Stime
  Dim CNT
  Dim WFlg
  Dim i
  Dim カンマ数
  Dim STAdd
  Dim huhu
  Dim popo
  Dim yuio
  Dim LPC
  Dim Ag
  Dim AcShNam
これだけあって、何の役だか分かりません。

それに「StartAddSet」なる非提示関数もありますね。

>それとも1レコードずつ、読込ませる際、IFにてF1の最終番号を取得し、そこから
>上に30行分DELETEするようなコードにすればよいのですか?
どうあれ、読み込まないと「最後の30件」は分からないので、
読み込めているならそのようにしてみてはいかがでしょう。

8328 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free