![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
No.7ベストアンサー
- 回答日時:
>(同じワークブックにテンプレートが2つあってCSVでーたを
>ふりわけないといけない(なにかバッティングしてるみたいで ひらかない))
テンプレートが二つあるというのは同じような雛形で別シートが存在する!という意味なのでしょうか?
お手元のファイルがどのようになっているのかこちらでは判らないので
何とも回答のしようがないのですが・・・
とりあえず今回は並び替えのコードを追加したものを投稿しておきます。
Sub Sample3()
Dim myDic As Object
Dim myR, myKey, myItem, myAry
Dim i As Long, lastRow As Long, wS As Worksheet
Dim wB As Workbook, myPath As String, fN As String '//←追加//
'▼CSVファイルを開き、This Workbook のSheet1にコピー&ペースト → CSVファイルを閉じる//
myPath = "保存場所のパス" & "\"
fN = "ファイル名.csv"
Workbooks.Open Filename:=myPath & fN
Set wB = ActiveWorkbook
wB.Worksheets(1).Cells.Copy ThisWorkbook.Worksheets("Sheet1").Range("A1")
wB.Close
'▲ここまで//
'▼これ以降は前回のコード!//
Set myDic = CreateObject("Scripting.Dictionary")
Set wS = Worksheets("Sheet2")
lastRow = wS.Cells(Rows.Count, "A").End(xlUp).Row
If lastRow > 5 Then
Range(wS.Cells(6, "A"), wS.Cells(lastRow, "Q")).ClearContents
End If
With Worksheets("Sheet1")
lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
myR = Range(.Cells(1, "A"), .Cells(lastRow, "E"))
For i = 1 To UBound(myR, 1)
If Not myDic.exists(myR(i, 1)) Then
myDic.Add myR(i, 1), myR(i, 2) & "_" & myR(i, 3) & "_" & myR(i, 4) & "_" & myR(i, 5)
End If
Next i
End With
myKey = myDic.keys
myItem = myDic.items
myR = Range(wS.Cells(6, "A"), wS.Cells(UBound(myKey) + 6, "Q"))
For i = 0 To UBound(myKey)
myAry = Split(myItem(i), "_")
myR(i + 1, 1) = myKey(i)
myR(i + 1, 4) = myAry(0)
myR(i + 1, 10) = myAry(1)
myR(i + 1, 14) = myAry(2)
myR(i + 1, 17) = myAry(3)
Next i
Range(wS.Cells(6, "A"), wS.Cells(UBound(myKey) + 6, "Q")) = myR
Set myDic = Nothing
'▼並び替え//
lastRow = wS.Cells(Rows.Count, "A").End(xlUp).Row
Range(wS.Cells(5, "A"), wS.Cells(lastRow, "Q")).Sort key1:=wS.Range("A5"), order1:=xlAscending, Header:=xlYes
wS.Activate
MsgBox "完了"
End Sub
※ 回答しても追加質問が多く、終わりがないようなので
とりあえず以上のコードで今回の質問の回答は終了にさせてください。m(_ _)m
最期まで質問に答えていただきありがとうございます
やっていくと次々問題がでてきまして、
なんとなく この値を変えるとこうなるとかそういうのはわかるんですが
とにかく自分でやってみて どうしてもだめだったら別で質問したいと思います
お忙しい中お手数お掛けしまして感謝します
No.6
- 回答日時:
>コピぺではなくCSVのデータを自動で取り込みたいんですが・・・
No.3で記載したように、コード記載のブックのSheet1にCSVファイルを取り込んだ後のコードにしています。
もちろんそのCSVファイルを開くことも可能ですが、
保存場所のパスとファイル名が必要になります。
とりあえず、CSVファイルをSheet1にコピー&ペーストし、Sheet2に表示するコードです。
↓にしてみてください。
操作したいブックの標準モジュールにしてください。
Sub Sample2()
Dim myDic As Object
Dim myR, myKey, myItem, myAry
Dim i As Long, lastRow As Long, wS As Worksheet
Dim wB As Workbook, myPath As String, fN As String '//←追加//
'▼CSVファイルを開き、This Workbook のSheet1にコピー&ペースト → CSVファイルを閉じる//
myPath = "保存場所のパス" & "\"
fN = "ファイル名.csv"
Workbooks.Open Filename:=myPath & fN
Set wB = ActiveWorkbook
wB.Worksheets(1).Cells.Copy ThisWorkbook.Worksheets("Sheet1").Range("A1")
wB.Close
'▲ここまで//
'▼これ以降は前回のコード!//
Set myDic = CreateObject("Scripting.Dictionary")
Set wS = Worksheets("Sheet2")
lastRow = wS.Cells(Rows.Count, "A").End(xlUp).Row
If lastRow > 5 Then
Range(wS.Cells(6, "A"), wS.Cells(lastRow, "Q")).ClearContents
End If
With Worksheets("Sheet1")
lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
myR = Range(.Cells(1, "A"), .Cells(lastRow, "E"))
For i = 1 To UBound(myR, 1)
If Not myDic.exists(myR(i, 1)) Then
myDic.Add myR(i, 1), myR(i, 2) & "_" & myR(i, 3) & "_" & myR(i, 4) & "_" & myR(i, 5)
End If
Next i
End With
myKey = myDic.keys
myItem = myDic.items
myR = Range(wS.Cells(6, "A"), wS.Cells(UBound(myKey) + 6, "Q"))
For i = 0 To UBound(myKey)
myAry = Split(myItem(i), "_")
myR(i + 1, 1) = myKey(i)
myR(i + 1, 4) = myAry(0)
myR(i + 1, 10) = myAry(1)
myR(i + 1, 14) = myAry(2)
myR(i + 1, 17) = myAry(3)
Next i
Range(wS.Cells(6, "A"), wS.Cells(UBound(myKey) + 6, "Q")) = myR
Set myDic = Nothing
wS.Activate
MsgBox "完了"
End Sub
※ コード内の「保存場所のパス」と「ファイル名」の部分は
プロパティで確認し、実際のものに書き換えてください。
※ プロパティを確認し、ファイルの種類で「Excel」になっていない場合は
「プログラム」で「Excel」に変更してください。(Excelで開けなかった場合)
※ コード内に記載しましたが、CSVファイルを閉じた後のコードはまったく変わっていません。
まず、本ブックのSheet1にCSVデータをそのまま取り込んで、Sheet2に表示するようにしていますので
「Sheet1」「Sheet2」の部分は実際のシート名にしておいてください。m(_ _)m
誠にありがとうございます 感謝します
見事に表示できました
あと順番を1~順に 並び替えるようにできたら完璧なんですが
その際のマクロを教えていただきたいのですが
あつかましくてすいません
No.5
- 回答日時:
No.3・4です。
>便宜上?CSVデータはべつのワークブックでひらいているんですね。
はい!
CSVファイル開き(指定しない場合はおそらくExcelで立ち上がると思います)
その状態がお示しの画像の上側になっているという前提のコードです。
(画像どおり項目行はなく、データは1行目からある)
>With Worksheets("Sheet1") の部分は
>書き換えないとといけないんですよね?
はい!
「Sheet1」の部分は実際のシート名にする必要があります。
もし、別ブックで開いたのであれば、Sheet全体を一旦コピーし、操作したいシートに貼り付け後マクロを実行してください。
当然「Sheet2」の方も実際のシート名に変更してください。m(_ _)m
No.4
- 回答日時:
No.3です。
書き忘れたコトが・・・
画像、A列「3」のデータのC列が「5mm」と「2mm」の違いがありますが、
最初に出現した「5mm」の方だけが表示されます。
それでも良いのでしょうか?m(_ _)m
丁寧な回答ありがとうございます
重複した項目のD,Eが示せればいいので問題ないです
NO,3で書いていただいたマクロでやってみます
なにか問題があればまた質問してもよろしいでしょうか?
No.3
- 回答日時:
こんばんは!
横からお邪魔します。CAVのデータは手作業でExcelで開き
Sheet1に上記画像のような配置で存在しているとします。
そして下側の画像がSheet2になっているという前提のコードです。
一般的には1行目は項目行になっていると思いますが、
画像どおりデータは1行目からあるとします。
標準モジュールです。
Sub Sample1()
Dim myDic As Object
Dim myR, myKey, myItem, myAry
Dim i As Long, lastRow As Long, wS As Worksheet
Set myDic = CreateObject("Scripting.Dictionary")
Set wS = Worksheets("Sheet2")
lastRow = wS.Cells(Rows.Count, "A").End(xlUp).Row
If lastRow > 5 Then
Range(wS.Cells(6, "A"), wS.Cells(lastRow, "Q")).ClearContents
End If
With Worksheets("Sheet1")
lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
myR = Range(.Cells(1, "A"), .Cells(lastRow, "E"))
For i = 1 To UBound(myR, 1)
If Not myDic.exists(myR(i, 1)) Then
myDic.Add myR(i, 1), myR(i, 2) & "_" & myR(i, 3) & "_" & myR(i, 4) & "_" & myR(i, 5)
End If
Next i
End With
myKey = myDic.keys
myItem = myDic.items
myR = Range(wS.Cells(6, "A"), wS.Cells(UBound(myKey) + 6, "Q"))
For i = 0 To UBound(myKey)
myAry = Split(myItem(i), "_")
myR(i + 1, 1) = myKey(i)
myR(i + 1, 4) = myAry(0)
myR(i + 1, 10) = myAry(1)
myR(i + 1, 14) = myAry(2)
myR(i + 1, 17) = myAry(3)
Next i
Range(wS.Cells(6, "A"), wS.Cells(UBound(myKey) + 6, "Q")) = myR
Set myDic = Nothing
wS.Activate
MsgBox "完了"
End Sub
※ Sheet2の6行目以降のデータを一旦消去するようにしていますので、
5列以外のデータ(画像では「JJ」の列)は消えます。
一発で解決!とはいかないと思いますが、
まずは叩き台として・・・m(_ _)m
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_15.png?8acaa2e)
No.2
- 回答日時:
よくわかる画像でした。
以下の操作をマクロ登録すればできるでしょう。元のcsvファイルで行う操作:
1)全てを選択(Ctrl+A)
2)Excelの機能「重複の削除」で重複データを削除する。重複チェック対象はA列のみとする(以下も参照)
https://dekiru.net/article/15288/
3)重複が削除できたら、もう一度Ctrl+Aで選択
4)Ctrl+Cでコピーし、コピー先のファイルに移動
コピー先で行う操作:
5)コピーしたい位置のセルをクリック
6)形式を選択して貼り付け(Ctrl+Alt+C)を行い、貼り付けの選択肢は「値(V)」を選んでOKをクリック
もしcsvファイルのA列の値に従って並べ替えを行う場合は、3)4)の間で行ってください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
- Excel(エクセル) CSVファイルがカンマ区切りにならない。対処法を教えていただきたいです。 仕事でSMS一斉送信ができ 2 2022/07/01 21:24
- Visual Basic(VBA) マクロを教えてください。 7 2023/06/01 19:47
- Excel(エクセル) Excelマクロ 差分抽出の方法が知りたいです。 2 2023/03/07 13:25
- Excel(エクセル) [Excel2016] 相関表等の自動作成 2 2022/08/01 20:34
- Excel(エクセル) 【Excel】指定した文字列に該当する行を重複しないようにリスト 3 2022/03/30 12:27
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- Excel(エクセル) エクセルでのマクロを使ったデータの並べ替え 3 2022/12/03 18:54
- その他(プログラミング・Web制作) Pythonで、データファイルと列名ファイルを1つのファイルにしたいです。 1 2023/07/27 20:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルの指数を無効にしたい
-
複数のCSVファイルを横に並べて...
-
大量のCSVデータを1つのエ...
-
複数の同じ様式のエクセルデー...
-
「ほかのアプリケーションを無...
-
VBAでユーザーフォーム上に参照...
-
エクセル2003 CSVファイルの取...
-
VBAでCSVの1行目だけを書き換え...
-
excelインポート時の「実行時エ...
-
破損したExcelファイルの内容を...
-
【エクセル VBA】CSVファイルの...
-
CSVファイルの結合(重複データ...
-
エクセルでcsvデータを自動読み...
-
ExcelVBAで今開いているユーザ...
-
フォルダ内の全ブックのシート...
-
複数のデータ系列の線の太さを...
-
エクセル終了時の保存確認メッ...
-
エクセルでツールバーに「縮小...
-
VBAを一度起動するとずっと出て...
-
EXCELマクロでxlsとxlsxを開く方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルの指数を無効にしたい
-
複数のCSVファイルを横に並べて...
-
excelインポート時の「実行時エ...
-
大量のCSVデータを1つのエ...
-
VBAでCSVの1行目だけを書き換え...
-
CSVファイルの結合(重複データ...
-
EXCELにcsv形式の外部データを...
-
複数のcsvファイルを1つのEXCEL...
-
Excel VBAを使った複数のCSVフ...
-
二つのCSVファイルを照らし合わ...
-
datファイル→csvファイル→datフ...
-
「ほかのアプリケーションを無...
-
【VBA初心者】同じフォルダ内の...
-
VBAでユーザーフォーム上に参照...
-
二つのファイル間でデータリン...
-
破損したExcelファイルの内容を...
-
EXCELLの動きが遅い
-
ExcelでCSVファイル読み込み時...
-
エクセルの日付への自動変換を...
-
エクセルの関数、VBAの使い分け
おすすめ情報
このようなCSVデータがありまして
このA列の 重複した番号は上位のデータのみのこして 1、2,3の順番に整列させて
右画像のような別のワークブックに自動で読み込むという作業です
CSVデータ
XLS サンプル
GGGは1,2,3,4・・・番号
HHH、EEE、MMM、NNNにB列~E列がはいるように
回答ありがとうございます
作業の流れはよく理解できましたが
それをVBAでやりたいのです
何回も作業しなければならず 自動化が必須でして
その場合のマクロはどのようになるのでしょうか?
コードを書いていただけますでしょうか?
CSVの作業はマクロの記録はできないですよね?
すみません なにぶん素人でして
もうひとつ質問いいよろしいでしょうか?
書かれたマクロでやってみたんですが
実行時エラー’9’:
書かれた範囲にインデックスが存在しません
というエラーがでました
便宜上?CSVデータはべつのワークブックでひらいているんですね。
そうすると
With Worksheets("Sheet1") の部分は
書き換えないとといけないんですよね?
質問多くてほんとすいません
すいません
コピぺではなくCSVのデータを自動で取り込みたいんですが
方法はありますか?
あとから付け足しみたいな感じになってすいません
並び替えできました!
wBClose の後に マクロの記録ででたマクロを貼り付けたら
できました!
他にも問題がでてきたんですが
(同じワークブックにテンプレートが2つあってCSVでーたを
ふりわけないといけない(なにかバッティングしてるみたいで ひらかない))
というようなことがあるんですが・・・
とにかく教えていただいた事を元にやってみます