Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2016)
.xlsxのファイルを新しいシートにインポートしたいです。
投稿日時: 20/06/13 10:58:15
投稿者: やっほー

こんにちは。
ユーザーフォームからインポートボタンを作成して、
.xlsxのファイルを新しいシートにインポートをしたいのですが、
やり方がわかりません。
お手数ですが、ご指導のほどお願い申し上げます。
 
変数を宣言
Dim fx As String
Dim wb As Workbook
Dim ws As Worksheet
 
    ' ファイルを開くダイアログ表示
    fx = Application.GetOpenFilename(",*.xlsx")
 
    ' ワークブックを開く
    Set wb = Workbooks.Open(fx)
 
    ' 1シート目を取得
    Set ws = wb.Worksheets(2)
 
    ' A1セルを参照
    Debug.Print ws.Cells(1, 1).Value
 
    ' ワークブックを閉じる
    wb.Close
 
これだけでは全く足りないものが沢山あるのはわかっておりますが、
どこをどの様につけたしたり、
このやり方以外の方法で書いたりすることが初心者のため、
わかりません。よろしくお願いします。

回答
投稿日時: 20/06/13 11:24:39
投稿者: simple

ご質問がよくわかりません。
今のコードで不足している機能は何でしょうか。
もしあれば、ご自分で項目を列挙して質問してください。
それはご自分で考えることで、他人に尋ねることではないです。

回答
投稿日時: 20/06/13 12:59:55
投稿者: WinArrow
投稿者のウェブサイトに移動

説明不十分で、且つ、コードを読んでもよくわかりません。
    
まず、
>xlsxのファイルを新しいシートにインポートをしたい
 
「新しいシートにインポート」という表現は、
何をしようとしているのか、よくわかりません。
 
この表現から類推すると
2つのケースが考えられます。
    
(1)特定のブックの特定のシートを複写して、新しいブックを作成し、保存する
(2)既存のブックに特定のブックの特定のシートを複写(追加)して保存する。
    
(1)のケースの手順
➀特定のブックを開く
A特定のシートをコピーする
 Sheets(特定).Copy
    →この時点で。新しいブックが作成されます。もちろん未保存です。
B新しいブックを名前を受けて保存する。
    
(2)のケースの手順
➀既存のブック開く
A特定のブックを開く
B特定のシートを既存ブックの指定位置へ複写する
  Workbooks(特定).Sheets(特定).Copy After:=Workbooks(既存).Shteets(場所)
    ※場所:シートの挿入位置 (Afterは後、Beforeは前)
    
B既存のブックを上書き保存する。
  
 
あなたが意図することは違うかもしれません。
もっと具体的な説明をしましょう。

投稿日時: 20/06/13 13:59:25
投稿者: やっほー

simple 様
ご連絡をありがとうございます。
貴重なお時間・ご指導を頂きましてありがとうございました。
 
WinArrow 様
ご連絡をありがとうございます。
 
エクセルファイルでbook.xlsmを作成しました。
その.xlsmファイルを開いて、その後、ユーザーフォームが出る様に作成しました。
そのユーザーフォームへコマンドボタンをつくり、
そのボタンを押したら、
デスクトップにある.xlsxのファイルを選択して、(ファイル先が選択できる形が良いです。)
新しいシートを作成して、xlsxのファイルがその新しいシートに作成される。
インポートされる様なものを作成したいです。
 
上記は参考というか、ご理解を頂きたいと思いまして記載させて頂きました。
不快に思われたら、スイマセンでした。
お手数ですが、ご指導をよろしくお願いします。

回答
投稿日時: 20/06/13 14:15:42
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:
新しいシートを作成して、xlsxのファイルがその新しいシートに作成される。
インポートされる様なものを作成したいです。

>新しいシートを作成して
どこにどのように作成するのでしょうか?
 

回答
投稿日時: 20/06/13 14:25:04
投稿者: WinArrow
投稿者のウェブサイトに移動

少なくとも
xlsxファイルの中のシートを、別のブックにインポートは可能ですが、
物理的に、Xlsxファイルをシートにはインポートできません。
 

回答
投稿日時: 20/06/13 15:04:52
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:

デスクトップにある.xlsxのファイルを選択して、


引用:

新しいシートを作成して、

の間の説明がかなり抜けているような気がします。
 

回答
投稿日時: 20/06/13 15:10:24
投稿者: simple

横から失礼します。
 
(1)ブックを開きます。
(2)そのブックの該当シートを、ThisWorkbookにシートコピーします。
(3)開いたブックを閉じます。
ということでよいのではないですか?
 
ご自分でマクロ記録をとって、コードを作ってみてください。
 
# 前スレッドを拝見しての感想(助言)
# 人からもらったコードをよく理解しないまま受け入れていると、
# 自分が理解できていることと、そうでないことの境目が曖昧としてきます。
# その状態を続けるのは危険です。今回いただいたものも良く理解するようにしてください。
#
# そう言うときこそ、ご自分でトライすることが大切だとおもいます。
# 理解していること、そうでないことをきちんと腑分けするのです。
# そのようにすることでしか、コードが書けるようにはなれません。
# 頑張ってください。
#
# なお、他人から回答してもらったものを、
# 他の掲示板で自作だと偽るのは、
# 回答して頂いた方にとても失礼な話です。

投稿日時: 20/06/13 16:15:57
投稿者: やっほー

WinArrow 様
 
ご連絡ありがとうございます。
◯新しいシートは、Excelの+ボタンを押してsheet2が作られる状態です。
.xlsxファイルの中にある内容をインポートです。
◯デスクトップにあるという部分は、
    ' ファイルを開くダイアログ表示
    fx = Application.GetOpenFilename(",*.xlsx")
のイメージをしております。
よろしくお願いします。
 
simple 様
 
ご連絡ありがとうございます。
貴重なお時間をお掛け致しました。
大変申し訳ございませんでした。

回答
投稿日時: 20/06/13 16:44:42
投稿者: WinArrow
投稿者のウェブサイトに移動

やっほー さんの引用:

◯新しいシートは、Excelの+ボタンを押してsheet2が作られる状態です。
.xlsxファイルの中にある内容をインポートです。
 

 
読み込んだxlsxファイル(ブック)に、新しいシートを追加するということですか?
  
もし、このようなことでしたら、インポートという表現は正しくありません。
インポートとは、
 当該ファイル以外(外部のファイル)からデータを取込むことを指します。
用語を正しく使わないと、あなたが意図したようには伝わりませんよ。
  
シートを追加するメソッド
    Sheets.Add After:=Sheets(1)
 
 

投稿日時: 20/06/13 16:51:00
投稿者: やっほー

WinArrow 様
 
ご連絡ありがとうございます。
 
インポートの意味がわかっておらずスイマセン。
この一行をどこに追加すれば宜しいでしょうか?
初心者の為、ご指導をよろしくお願いします。

回答
投稿日時: 20/06/13 16:58:39
投稿者: WinArrow
投稿者のウェブサイトに移動

意味不明な言葉
>.xlsxファイルの中にある内容をインポートです。
 
.xlsxファイルの中にある内容
って何ですか?
自分のやりたいことをきちんと文章にしていますか?
前レスでも書きましたが、
「インポート」という言葉を理解せずに使っていませんか?
 
 

投稿日時: 20/06/13 18:03:25
投稿者: やっほー

WinArrow 様
 
ご連絡ありがとうございます。
xlsxファイルのデータが新しいシートへ(sheet2など)に読み込まれれば良いです。
初心者の為、ご了承下さい。
 
VBAでボタンをクリックしたら、外部データにインポートしたいのです。
テキストファイルだと上手く行くのですが、.xlsxの場合は、どの様にインポートしていかわからなくなっております。
テキストファイル場合は下記の内容です。
 
どんなマクロ/VBAでも良いので、ご指導をよろしくお願いします。
 
 Dim txtName As String
  
    txtName = Application.GetOpenFilename("テキストファイル,*.txt")
     
    Application.CutCopyMode = False
    With Sheets("sheet2").QueryTables.Add(Connection:= _
        "TEXT;" & txtName, Destination:=Sheets("sheet2").Range("A1"))
         
        .Name = "test"
        .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 = False
        .TextFileTabDelimiter = True
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
        .Delete
    End With
       
  Unload UserForm1 'ユーザーフォームを閉じる。

回答
投稿日時: 20/06/13 18:23:28
投稿者: WinArrow
投稿者のウェブサイトに移動

やっほー さんの引用:
WinArrow 様
 
ご連絡ありがとうございます。
xlsxファイルのデータが新しいシートへ(sheet2など)に読み込まれれば良いです。
初心者の為、ご了承下さい。
 
VBAでボタンをクリックしたら、外部データにインポートしたいのです。

 
>外部データにインポートしたい
 
日本語になっていませんよ
インポートの意味わかっていませんよね?
 
インポートとは、外部から取込むことです。
外部に取り出すことは、エクスポートといいます。
 
投稿日時: 20/06/13 12:59:55

(1)のケース
に答えが書いてあります。
 
シート2を

投稿日時: 20/06/13 19:20:37
投稿者: やっほー

WinArrow 様
 
ご連絡ありがとうございました。
私にはわかりませんでした。
 
恐れ入りますが、
どなたかご意見をよろしくお願いします。

回答
投稿日時: 20/06/13 19:28:55
投稿者: simple

再掲します。

引用:
(1)ブックを開きます。
(2)そのブックの該当シートを、ThisWorkbookにシートコピーします。
(3)開いたブックを閉じます。
ということでよいのではないですか?
  
ご自分でマクロ記録をとって、コードを作ってみてください。

Excelブックは複数シートのこともあるし、
特定のシートに直接インポートする手段は提供されていません。
ですから、上記の手段をとるのが最善というか、普通の手法です。
 
シートコピーする動作をマクロ記録すれば、肝心なところのコードは得られるはずです。
こうしたことを一歩一歩積み上げる必要があるんです。誰がやっても同じです。

回答
投稿日時: 20/06/13 19:53:44
投稿者: simple

補足します。
別の方法として、

1.新しいシートを追加し、
2.ブックを読み込み、
3.該当シートの全範囲をコピーペイストする
と言う手もありますが、
これだと行幅などが、読み込むべきシートのそれとは異なってきますから、
その点では、シートコピーするほうがメリットがあります。
それで、その手法を提示しました。
 
# 結果のコードだけでなく、それを作るプロセスに注目して欲しいですね。

回答
投稿日時: 20/06/13 20:43:13
投稿者: WinArrow
投稿者のウェブサイトに移動

やっほー さんの引用:
WinArrow 様
 
ご連絡ありがとうございました。
私にはわかりませんでした。
 
恐れ入りますが、
どなたかご意見をよろしくお願いします。

この発言は
コードの作成依頼でしょうか?
 
ご希望には、応じられませんね・・・・

投稿日時: 20/06/13 21:27:48
投稿者: やっほー

simple 様
ご連絡ありがとうございます。
そして、再掲ありがとうございます。
検討してみます。
 
WinArrow 様
ご連絡ありがとうございます。
承知致しました。。
ありがとうございました。
 
解決に至らず、仕事が進まずに困っております。
恐れ入りますが、
どなたかご意見をよろしくお願いします。

回答
投稿日時: 20/06/13 21:41:18
投稿者: simple

やっほー さんの引用:

(前略)
解決に至らず、仕事が進まずに困っております。
恐れ入りますが、
どなたかご意見をよろしくお願いします。
でしたら、なおのこと、こちらの指摘することを実行して、
ご自分で前進する努力をしてください。
引用:
(1)ブックを開きます。
(2)そのブックの該当シートを、ThisWorkbookにシートコピーします。
(3)開いたブックを閉じます。
ということでよいのではないですか?
ご自分でマクロ記録をとって、コードを作ってみてください

(1)(3) は最初の質問にすでにあるので必要ないですね。
二つのブックがあって、シートをコピーする動作をマクロ記録するだけなんですがね。
(2)のマクロ記録は、たったの一行ですよ。
 
これをする気力もなく、ともかく回答者からコードをもらいたいのですか?
ご自分でコードを作る気持ちはまったく無いのですか?
それほど難しいことではないので、ご自分でトライしてください、と
申し上げているんですがねえ。

回答
投稿日時: 20/06/13 21:48:03
投稿者: WinArrow
投稿者のウェブサイトに移動

もう一度、書きます。
 
 
この掲示板は、コードの作成依頼を禁止しています。
そして、
あなたが問題解決できるようお手伝いしますが、
あなたの仕事をお手伝いするところではありません。
 
きついことを言いますが、
 
あなた自身が努力をしない限り
解決しないと考えた方がよいでしょう。
努力する姿勢を見せてはいかがですか?
 
 
 

投稿日時: 20/06/13 21:58:46
投稿者: やっほー

 simple 様
 
ご連絡ありがとうございます。
わからなく困っておるのでこの掲示板へ質問しております。
初心者の為、質問の内容も通じない点があるかと思いますが、
一生懸命、コードを記載したりして伝えようと質問者は心掛けておると思っております。
あまり申し上げたくはありませんが、
 simple様の回答ですと質問を質問返ししているだけだと思います。
なので、貴重なお時間をお掛け致しましてありがとうございました。
 
解決に至らず、仕事が進まずに困っております。
恐れ入りますが、
どなたかご意見をよろしくお願いします。
 

回答
投稿日時: 20/06/13 22:03:17
投稿者: simple

マクロ記録はとったのですか?

回答
投稿日時: 20/06/13 22:26:18
投稿者: simple

私はあなたの質問に、質問などしていないですよ。何か質問してますか?
解決策を提示していますが。
 
ちょっと誤解を生むのを承知で敢えて書いてみます。
他の掲示板でも、自分でできることもせずに次から次に質問を続けるので、
親切な回答者からも愛想づかしされることになったんじゃないですか。
そういう質問の仕方には限界があるんですよ。
 
それは結局、自分に戻ってくるんですよ。
無批判に回答を飲み込んでいると、自分が分かっていることと、そうでないことの
区分けができなくなり、かといって簡単にコードが得られる経験だけしてしまうと、
自分で努力するのが嫌になるんですよ。もう、そうなっているんじゃないですか?
 
そういう悪循環に陥るようなことはやめて、
解決策を示されたんだから、手を動かして実行することが大事ですよ。
それで見えてくること、理解が進むことがたくさんあるはずなんです。
 
私はそういうことを期待してコメントをしています。
 
もちろん、質問者さんが今の段階で思いついたりすることが難しいことであったり、
難易度が高くて対応するのは難しいロジックだなと判断したり、
説明するのが大変な時は、コードをそのまま提示します。
しかし、そうでなければ、質問者さんが自力で前進するのをできるだけサポートするつもりで
やっています。

回答
投稿日時: 20/06/13 23:07:28
投稿者: WinArrow
投稿者のウェブサイトに移動

努力その1
まずは、言葉で自分のやりたいことを説明することから始めましょう。
 
実施したいことを箇条書きにして整理しましょう。
自分で意味を理解していない用語は使わないことです。
回答者に誤解を与える言葉を使うと、混乱を招くことにつながります。
コードは、それから作成すればよいでしょう。
回答者には、あなたのPCの画面は見えませんから、
見えるような言葉で記述すること。
 
これがキチンと書けるようになる(日本語で)と、
これをVBAに置き換えていく作業がコーディングです。
 
 

回答
投稿日時: 20/06/13 23:17:21
投稿者: simple

Sub test()
    Dim fx As String
    Dim wb As Workbook
    Dim ws As Worksheet

    ' ファイルを開くダイアログ表示
    fx = Application.GetOpenFilename(",*.xlsm")

    ' ワークブックを開く
    Set wb = Workbooks.Open(fx)

    ' 1シート目を取得
    Set ws = wb.Worksheets(1) '2とあったが、1の間違いだろう。
    
    'ここでやりたいのは、wsを ThisWorkbookにコピーすること
    '■■■■■■このコードが必要。
    '↑ ここは、シートをコピーする動作をマクロ記録すればわかるはず。
    '    それをちょっと修正するだけで良いはず。
    
    ' ワークブックを閉じる
    wb.Close
End Sub

 
不明なら、マクロ記録をここに示したらどうか。

回答
投稿日時: 20/06/15 11:16:32
投稿者: sk

引用:
エクセルファイルでbook.xlsmを作成しました。
その.xlsmファイルを開いて、その後、ユーザーフォームが出る様に作成しました。
そのユーザーフォームへコマンドボタンをつくり、
そのボタンを押したら、
デスクトップにある.xlsxのファイルを選択して、(ファイル先が選択できる形が良いです。)
新しいシートを作成して、xlsxのファイルがその新しいシートに作成される。
インポートされる様なものを作成したいです。

引用:
xlsxファイルのデータが新しいシートへ(sheet2など)に読み込まれれば良いです。

(標準モジュール)
---------------------------------------------------------------
Public Sub subImportWorksheet()

    Dim wbkSource As Workbook
    Dim wsSource As Worksheet
    
    Dim wbkDestination As Workbook
    Dim wsDestination As Worksheet
    
    Dim varSourceFilePath As Variant
    
    '[ファイルを開く]ダイアログを開き、インポート元のブックのパスを取得する
    varSourceFilePath = Application.GetOpenFilename("Excel ブック (*.xlsx;*.xls), *.xlsx;*.xls")
    
    '[キャンセル]ボタンがクリックされた場合
    If varSourceFilePath = False Then
        プロシージャを抜ける
        Exit Sub
    End If
    
    'マクロ実行中の画面表示を更新を無効にする
    Application.ScreenUpdating = False
    
    'ブックを開いて参照を取得
    Set wbkSource = Workbooks.Open(varSourceFilePath)
    '1つめのワークシートを参照
    Set wsSource = wbkSource.Worksheets(1)
    
    'なお、ワークシートが 2 つ以上存在する場合については考慮していない。
    
    'このブック自身を参照
    Set wbkDestination = ThisWorkbook
    With wbkDestination.Worksheets
        '最後のワークシートの後ろに新規ワークシートを挿入し、その参照を取得
        Set wsDestination = .Add(After:=.Item(.Count))
    End With
    
    'wsSource において使用されている領域をコピー
    wsSource.UsedRange.Copy
    'wsDestination の A1 セルに値と数値書式を貼り付け
    wsDestination.Cells(1, 1).PasteSpecial Paste:=xlPasteValuesAndNumberFormats
    'コピーモードの解除
    Application.CutCopyMode = False

    Set wsSource = Nothing
    '開いたファイルを保存せずに閉じる
    wbkSource.Close False
    Set wbkSource = Nothing
    
    '新規ワークシートに対する操作
    With wsDestination
        '全ての列の幅を自動調節
        .UsedRange.EntireColumn.AutoFit
        'シートを選択
        .Select
        'A1セルを選択
        .Cells(1, 1).Select
    End With
    
    'マクロ実行中の画面表示を更新を有効にする
    Application.ScreenUpdating = True

    Set wsDestination = Nothing
    Set wbkDestination = Nothing

End Sub
---------------------------------------------------------------
 
以上のようなことが出来ればよい、ということでしょうか。

投稿日時: 20/06/15 11:48:00
投稿者: やっほー

sk 様
ご連絡ありがとうございます。
凄いです。
前回も助けて頂いき、今回もありがとうございます。
本当にありがとうございました。
感謝致します。