Excel VBA質問箱 IV

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

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


1158 / 13645 ツリー ←次へ | 前へ→

【75920】フォルダ内での処理につきまして マリモ 14/8/5(火) 14:16 質問[未読]
【75922】Re:フォルダ内での処理につきまして γ 14/8/5(火) 20:06 発言[未読]
【75928】Re:フォルダ内での処理につきまして マリモ 14/8/6(水) 12:02 発言[未読]
【75929】Re:フォルダ内での処理につきまして γ 14/8/6(水) 21:01 発言[未読]
【75930】Re:フォルダ内での処理につきまして マリモ 14/8/7(木) 9:37 発言[未読]
【75933】Re:フォルダ内での処理につきまして γ 14/8/7(木) 21:30 発言[未読]
【75937】Re:フォルダ内での処理につきまして マリモ 14/8/8(金) 11:06 質問[未読]
【75942】Re:フォルダ内での処理につきまして γ 14/8/8(金) 21:02 発言[未読]
【75955】Re:フォルダ内での処理につきまして マリモ 14/8/11(月) 9:08 発言[未読]
【75943】Re:フォルダ内での処理につきまして γ 14/8/9(土) 17:52 発言[未読]
【75956】Re:フォルダ内での処理につきまして マリモ 14/8/11(月) 9:16 発言[未読]
【75957】Re:フォルダ内での処理につきまして γ 14/8/11(月) 9:51 発言[未読]
【75964】Re:フォルダ内での処理につきまして マリモ 14/8/12(火) 9:08 お礼[未読]

【75920】フォルダ内での処理につきまして
質問  マリモ  - 14/8/5(火) 14:16 -

引用なし
パスワード
   お世話になっております
マリモと申します。
よろしくお願いいたします。

【状態】
フォルダ内にフォルダがあり、TXTデータが1から連番で入っています。
エクセルで「分析」という名称のBOOK内に「ベースシート」というシート名があります。

【作業内容】
それを、TXTデータが入っているフォルダの名称を新たなエクセルBOOKの名称にし、
、TXTの1から連番のある分だけ、シートに1から連番でシートを作成し、「分析」の中の「ベースシート」をコピーします。
TXTデータを1つずつ開いて全選択、全コピーし、シートのA2の位置で貼り付けし、
区切り位置で「カンマやタブなどの区切り文字によってフィールドごとに区切られたデータ」を選択し、次へをクリックし、スペースにレ点を入れ、完了。
A列のみ選択されている状態なのでC列まで選択し、並べ替えで「先頭行をデータの見出しとして使用する」のレ点がない状態にし、最優先されるキーを「C列」にし、OKにする。
開いたTXTデータはすべて消し、最後に上書きをして保存。

【特に気になる個所】
区切り位置は最初に一度行うと二度目からはその作業をしなくても貼り付けの時点で既になっている。
並び替えの際に「先頭行をデータの見出しとして使用する」のところに必ずレ点が入っているとは限らない。


初心者でございまして
マクロの記録を使いましたが、なかなか思うように出来ませんでした。
よろしくお願いいたします。

【75922】Re:フォルダ内での処理につきまして
発言  γ  - 14/8/5(火) 20:06 -

引用なし
パスワード
   ▼マリモ さん:
>マクロの記録を使いましたが、なかなか思うように出来ませんでした。
まず、そのマクロ記録の結果を示してください。

【75928】Re:フォルダ内での処理につきまして
発言  マリモ  - 14/8/6(水) 12:02 -

引用なし
パスワード
   ▼γ さん:
>▼マリモ さん:
>>マクロの記録を使いましたが、なかなか思うように出来ませんでした。
>まず、そのマクロ記録の結果を示してください。

失礼いたしました。

【記録そのままの状態】
Sub test1()
'
' test1 Macro
'

'
  Sheets("ベースシート").Select
  Sheets("ベースシート").Copy Before:=Sheets(1)
  Sheets("ベースシート (2)").Select
  Sheets("ベースシート (2)").Name = "1"
  Range("A2").Select
  ActiveSheet.Paste
  Selection.TextToColumns Destination:=Range("A2"), DataType:=xlDelimited, _
    TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
    Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
    :=Array(Array(1, 1), Array(2, 1), Array(3, 1)), TrailingMinusNumbers:=True
  Range(Selection, Selection.End(xlToRight)).Select
  ActiveWorkbook.Worksheets("1").Sort.SortFields.Clear
  ActiveWorkbook.Worksheets("1").Sort.SortFields.Add Key:=Range("C2:C59"), _
    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
  With ActiveWorkbook.Worksheets("1").Sort
    .SetRange Range("A2:C59")
    .Header = xlGuess
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
  End With
  Sheets("ベースシート").Select
  Sheets("ベースシート").Copy Before:=Sheets(1)
  Range("A2").Select
  ActiveSheet.Paste
  ActiveWorkbook.Worksheets("ベースシート (2)").Sort.SortFields.Clear
  ActiveWorkbook.Worksheets("ベースシート (2)").Sort.SortFields.Add Key:=Range( _
    "C2:C99"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
    xlSortNormal
  With ActiveWorkbook.Worksheets("ベースシート (2)").Sort
    .SetRange Range("A2:C99")
    .Header = xlGuess
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
  End With
  Sheets("ベースシート (2)").Select
  Sheets("ベースシート (2)").Name = "2"
  ActiveWorkbook.Save
  ActiveWindow.Close
  Sheets("ベースシート").Select
  Sheets("ベースシート").Copy Before:=Sheets(1)
  Sheets("ベースシート (2)").Select
  Sheets("ベースシート (2)").Name = "1"
  Range("A2").Select
  ActiveSheet.Paste
  ActiveWorkbook.Worksheets("1").Sort.SortFields.Clear
  ActiveWorkbook.Worksheets("1").Sort.SortFields.Add Key:=Range("C2:C91"), _
    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
  With ActiveWorkbook.Worksheets("1").Sort
    .SetRange Range("A2:C91")
    .Header = xlGuess
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
  End With
  Sheets("ベースシート").Select
  Sheets("ベースシート").Copy Before:=Sheets(1)
  Sheets("ベースシート (2)").Select
  Sheets("ベースシート (2)").Name = "2"
  Range("A2").Select
  ActiveSheet.Paste
  ActiveWorkbook.Worksheets("2").Sort.SortFields.Clear
  ActiveWorkbook.Worksheets("2").Sort.SortFields.Add Key:=Range("C2:C65"), _
    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
  With ActiveWorkbook.Worksheets("2").Sort
    .SetRange Range("A2:C65")
    .Header = xlGuess
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
  End With
  ActiveWorkbook.Save
  ActiveWindow.Close
End Sub

記録したまま実行をかけるとまず
Sheets("ベースシート").Select
ここでデバック表示が出てしまいました。

【こんな感じで始めるのかなと思っている部分】
  Dim srcFName
  Dim orgBook As Worksheet
  Dim orgSheet As Worksheet
  Dim bookPath As String
  Dim r As Range
  
  srcFName=Application GetOpenFilename("ベースシートBook,分析xlsx)
  If VarType(srcFName) = vbBoolean Then Exit Sub
  Set orgBook=Workbooks Open(srcFName)


ここではOpenのところがコンパイルエラーでステートメントの最後と表示されました。

よろしくお願いいたします。

【75929】Re:フォルダ内での処理につきまして
発言  γ  - 14/8/6(水) 21:01 -

引用なし
パスワード
   記録コードの提供ありがとうございます。

その前にいくつか確認したいことがあります。

実行したいことは、以下のようなことで良いのですか。
1. 新たなBOOKを作成し、その名称を、TXTファイルの入っているフォルダの名称とする。
2. フォルダ中のテキストファイルの数だけ、以下の3〜6を繰り返す。
 3.「分析」ブックの中の「ベースシート」を元にしてシートを増幅する。
 4. テキストファイルを開いて、その内容を、3.のシートのA2以下の位置に値貼り付けする。
 5. A列に読み込まれた文字列を、スペースを区切り文字として、各列に分離する。
 6. 1行目を見出しとし、A:C列の範囲を、C列をソートキーとして昇順でソートする
7. Bookを保存する。
-----------
(Q1) テキストファイルの拡張子は何ですか?
(Q2) ナンバリングはどのようにされていますか?
   例1: 共通文字列 + 3桁の数字(001,002,003・・・)
   例2: 共通文字列 + 数字(1,2,3,・・,10,11,・・・)
(Q3)ベースシートを使う意図はなにですか?
  単に、一行目の見出しを揃えたい?
  それとも、シートの各種書式をそれで統一したいということ?)

【75930】Re:フォルダ内での処理につきまして
発言  マリモ  - 14/8/7(木) 9:37 -

引用なし
パスワード
   ▼γ さん:
>記録コードの提供ありがとうございます。
>
>その前にいくつか確認したいことがあります。
>
>実行したいことは、以下のようなことで良いのですか。
>1. 新たなBOOKを作成し、その名称を、TXTファイルの入っているフォルダの名称とする。
>2. フォルダ中のテキストファイルの数だけ、以下の3〜6を繰り返す。
> 3.「分析」ブックの中の「ベースシート」を元にしてシートを増幅する。
> 4. テキストファイルを開いて、その内容を、3.のシートのA2以下の位置に値貼り付けする。
> 5. A列に読み込まれた文字列を、スペースを区切り文字として、各列に分離する。
> 6. 1行目を見出しとし、A:C列の範囲を、C列をソートキーとして昇順でソートする
>7. Bookを保存する。

はい。上記の通りでございます。

>-----------
>(Q1) テキストファイルの拡張子は何ですか?
拡張子はTXTで、メモ帳で開きます。

>(Q2) ナンバリングはどのようにされていますか?
>   例1: 共通文字列 + 3桁の数字(001,002,003・・・)
>   例2: 共通文字列 + 数字(1,2,3,・・,10,11,・・・)
例2の通り、1.TXT、2.TXT、3.TXTとなっております。

>(Q3)ベースシートを使う意図はなにですか?
>  単に、一行目の見出しを揃えたい?
>  それとも、シートの各種書式をそれで統一したいということ?)
ベースシートのE列以降に関数を入れてありまして、
速度の計算を同じように揃えたいのが目的です。


説明不足で申し訳ありませんでした。
よろしくお願いいたします。

【75933】Re:フォルダ内での処理につきまして
発言  γ  - 14/8/7(木) 21:30 -

引用なし
パスワード
   ・「外部データの取り込み」 - 「テキストファイル」を利用してみました。
・読み込む列の数は3つと仮定しました。

前提の違うところがあれば、テキトーに修正してください。
あくまでも参考コードということで、読み解いてみてください。

Sub test()
  Const folderName As String = "D:\MyDocuments\201408\test\"
                 '■修正してください。尻尾の\に注意
  Dim ws As Worksheet
  Dim rng As Range
  Dim lastRow As Long
  Dim k As Long

  For k = 1 To 2 '■ファイルはテスト的に1.txt から 2.txtまでとしています。
    Sheets("ベースシート").Copy After:=Sheets(Sheets.Count)
    Set ws = ActiveSheet
    ws.Name = CStr(k)

    ' テキストファイルをA2の位置に読み込む
    With ws.QueryTables.Add(Connection:= _
      "TEXT;" & folderName & CStr(k) & ".txt", _
       Destination:=ws.Range("$A$2"))

      .Name = CStr(k)
      .FieldNames = True
      .RowNumbers = False
      .FillAdjacentFormulas = False
      .PreserveFormatting = True
      .RefreshOnFileOpen = False
      .RefreshStyle = xlInsertDeleteCells
      .SavePassword = False
      .SaveData = True
      .AdjustColumnWidth = True
      .RefreshPeriod = 0
      .TextFilePromptOnRefresh = False
      .TextFilePlatform = 932
      .TextFileStartRow = 1
      .TextFileParseType = xlDelimited
      .TextFileTextQualifier = xlTextQualifierDoubleQuote
      .TextFileConsecutiveDelimiter = True
      .TextFileTabDelimiter = True
      .TextFileSemicolonDelimiter = False
      .TextFileCommaDelimiter = False
      .TextFileSpaceDelimiter = True
      .TextFileColumnDataTypes = Array(1, 1, 1)
      .TextFileTrailingMinusNumbers = True
      .Refresh BackgroundQuery:=False
    End With

    'A2からC列の最終行までを対象に、C列で昇順にソート
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    Set rng = ws.Range("A2", ws.Cells(lastRow, 3))

    With ws.Sort
      .SortFields.Clear
      .SortFields.Add Key:=Range("C2"), SortOn:=xlSortOnValues, _
              Order:=xlAscending, DataOption:=xlSortNormal
      .SetRange rng
      .Header = xlGuess
      .MatchCase = False
      .Orientation = xlTopToBottom
      .SortMethod = xlPinYin
      .Apply
    End With
  Next
End Sub

【75937】Re:フォルダ内での処理につきまして
質問  マリモ  - 14/8/8(金) 11:06 -

引用なし
パスワード
   ▼γ さん:
ありがとうございます。
動作確認が出来ました。

すみません。できればE列以降の場所を変更したくないので
この動作の後にD列〜F列を削除したいのですが、
お教えいただけますでしょうか。

よろしくお願いいたします。

【75942】Re:フォルダ内での処理につきまして
発言  γ  - 14/8/8(金) 21:02 -

引用なし
パスワード
   こんにちは。

二つの意味で疑問があります。

(1)ひとつは、内容の点。
> ベースシートのE列以降に関数を入れてありまして、
> 速度の計算を同じように揃えたいのが目的です。
という発言と、
> できればE列以降の場所を変更したくないので
> この動作の後にD列〜F列を削除したいのですが
と言う発言の関係はどうなるのですか?
E列に入っている関数は削除していいのですか?

(2)もうひとつは、リクエストすれば回答が得られる、
と勘違いしていませんか?という点。

削除なのか、消去なのか知りませんが、
それはご自分では書けないのですか?
その動作をマクロ記録して、
ただ、シートをwsで特定するだけだと思いますが。

私の提示したコードが理解できないようでしたら、
ステップ実行しながら、どんな動作をするか、
途中で変数はどのように変わるか、を調べて見て下さい。

結果を検証するだけでなく、内容を理解してください。
また、今回の追加の仕様をご自分で考える事は、
理解を進める絶好の材料だと思います。

【75943】Re:フォルダ内での処理につきまして
発言  γ  - 14/8/9(土) 17:52 -

引用なし
パスワード
   >すみません。できればE列以降の場所を変更したくないので
>この動作の後にD列〜F列を削除したいのですが、
>お教えいただけますでしょうか。

ところで、
これは、ABC列にテキストファイルを挿入したことで、
もともとのABC列が右にずれているということですか?
私のところではそうはならないですが。
何らかの設定によって、そうなることがあるのでしょうか。
事実を確認したいですね。

【75955】Re:フォルダ内での処理につきまして
発言  マリモ  - 14/8/11(月) 9:08 -

引用なし
パスワード
   ▼γ さん:
>こんにちは。
>
>二つの意味で疑問があります。
>
>(1)ひとつは、内容の点。
>> ベースシートのE列以降に関数を入れてありまして、
>> 速度の計算を同じように揃えたいのが目的です。
>という発言と、
>> できればE列以降の場所を変更したくないので
>> この動作の後にD列〜F列を削除したいのですが
>と言う発言の関係はどうなるのですか?
>E列に入っている関数は削除していいのですか?
削除はしないで欲しいです。

>(2)もうひとつは、リクエストすれば回答が得られる、
>と勘違いしていませんか?という点。
申し訳ございません。
依存しすぎていたかもしれません。

>削除なのか、消去なのか知りませんが、
>それはご自分では書けないのですか?
>その動作をマクロ記録して、
>ただ、シートをwsで特定するだけだと思いますが。
wsの意味がよく分かりませんが
調べてみます。

>私の提示したコードが理解できないようでしたら、
>ステップ実行しながら、どんな動作をするか、
>途中で変数はどのように変わるか、を調べて見て下さい。
>
>結果を検証するだけでなく、内容を理解してください。
>また、今回の追加の仕様をご自分で考える事は、
>理解を進める絶好の材料だと思います。
勉強していきたいと思います。

【75956】Re:フォルダ内での処理につきまして
発言  マリモ  - 14/8/11(月) 9:16 -

引用なし
パスワード
   ▼γ さん:
>>すみません。できればE列以降の場所を変更したくないので
>>この動作の後にD列〜F列を削除したいのですが、
>>お教えいただけますでしょうか。
>
>ところで、
>これは、ABC列にテキストファイルを挿入したことで、
>もともとのABC列が右にずれているということですか?
>私のところではそうはならないですが。
>何らかの設定によって、そうなることがあるのでしょうか。
>事実を確認したいですね。
元々のABC列が右へずれてしまい、A1に入力してあったのが
D1に表示されています。
元々のE列はH列に表示されています。
ですので、最後に後からできてしまった列を削除できないかと
質問させていただいた次第でございます。

とはいえ、もう少し自分で考えてみます。
ありがとうございました。

【75957】Re:フォルダ内での処理につきまして
発言  γ  - 14/8/11(月) 9:51 -

引用なし
パスワード
   「ベースシート」の読み込み予定のところに
なんらかのものが書き込まれているからですね。
何も書き込まれていなければそうはなりません。

対応策ですが、
   .RefreshStyle = xlInsertDeleteCells
のことろを  
   .RefreshStyle = xlOverwriteCells
と書き換えてください。

> wsの意味がよく分かりませんが
> 調べてみます。
私の提示したコードに出てきます。
それぞれのワークシートオブジェクトにつけた変数名です。
Dim ws As Worksheet
・・・
Set ws = ActiveSheet

提示されたコードは使うことがまず先ですが、
よく読んで理解するようにしてください。

# 上記の問題は先ほどのコード修正で対応できるはずですから、
# wsを使ってシートの特定列を削除する必要性はなくなるはずですけど。

【75964】Re:フォルダ内での処理につきまして
お礼  マリモ  - 14/8/12(火) 9:08 -

引用なし
パスワード
   ▼γ さん:
>「ベースシート」の読み込み予定のところに
>なんらかのものが書き込まれているからですね。
>何も書き込まれていなければそうはなりません。
何も知らずにすみませんでした。

>対応策ですが、
>   .RefreshStyle = xlInsertDeleteCells
>のことろを  
>   .RefreshStyle = xlOverwriteCells
>と書き換えてください。
昨日書き換えたところ、
.Refresh BackgroundQuery:=False
の部分がデバック表示が出てしまい悩んでいましたが
今朝実行したところ、上手く処理できました。

>> wsの意味がよく分かりませんが
>> 調べてみます。
>私の提示したコードに出てきます。
>それぞれのワークシートオブジェクトにつけた変数名です。
>Dim ws As Worksheet
>・・・
>Set ws = ActiveSheet
>
>提示されたコードは使うことがまず先ですが、
>よく読んで理解するようにしてください。
>
># 上記の問題は先ほどのコード修正で対応できるはずですから、
># wsを使ってシートの特定列を削除する必要性はなくなるはずですけど。

最後まで色々とお教えいただき、ありがとうございました。
お教えいただいたコードを元に
今後理解を深めて参りたいと存じます。

貴重なお時間を割いてくださいましたお心遣いに感謝いたします。

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