質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

360閲覧

データ挿入、データ削除をボタンで行う。

15DB109_hotaka

総合スコア22

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2018/01/05 11:08

VBA初心者です。
現在、スコア(球技)の集計をしたいと思い
表にファイル内のデータを指定の位置に挿入する。というものを実現したいのですが
色々試したのですが、なかなかうまくいきません。
・ボタンを押すと初めは挿入できるが、2回目以降はセルがずれてしまう。
・保存方法のせいなのか、エクセルを閉じ再び立ち上げるとマクロが無効になっている。
などなど、イマイチ理解できていない状況です。

今回の処理の流れとしまして
・あらかじめ表を作成しておく(編集できないようにしたい)
・PC上のデータファイル(.csv)を[挿入ボタン]で表に挿入する
・[削除ボタン]にて挿入したデータを一括削除する

これは難しいでしょうか?できそうなのですが、初心者が故に成功しません。
ご教授いただける方よろしくお願いします。
当方、Excel 2011 for Macを使用しているのですが
Excel 2013も使用可能です。

開発環境:Excel 2011 for Mac , MacBookPro

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ご質問の内容だけでは要件を正確に把握することができなかったのですが、
わかる範囲で以下のコードを書きました。
コメントもしっかり書いたので理解可能だと思います。
これをベースに 15DB109_hotaka さんの実施したい内容をコード化すれば実施したいことができると思います。
ボタンについては、ご自身で作成された上で
[挿入ボタン] に対しては「ImportCsvFile」
[削除ボタン] に対しては「DeleteCsvData」
を登録すれば実行可能になるはずです。

・保存方法のせいなのか、エクセルを閉じ再び立ち上げるとマクロが無効になっている。

これについてはExcelの設定が原因と思われます。ここを参照して解決できませんか?

VBA

1Option Explicit 2 3' CSVファイルの1行目をコピーするかを設定してください 4' (通常は各列の題名が記載されている行なのでコピー不要と思っています) 5Private Const NEED_HEADER As Boolean = False 6 7' CSVファイルのの内容をシートにインポート 8Public Sub ImportCsvFile() 9 10 ' 変数宣言 11 Dim csvBook As Workbook 12 Dim csvSheet As Worksheet 13 Dim activeWorksheet As Worksheet 14 Dim activeCell As Range 15 Dim csvBookPath As String 16 17 ' インポート処理を実施して良いかの確認ダイアログ 18 ' (NO が選択された場合は処理終了) 19 If MsgBox("選択されたセルにCSVデータをインポートしてよろしいですか?", vbQuestion + vbYesNo, "確認") = vbNo Then 20 Exit Sub 21 End If 22 23 ' アクティブシートを取得 24 Set activeWorksheet = ActiveSheet 25 26 ' 貼り付け対象セルを取得 27 On Error Resume Next 28 Set activeCell = Selection 29 On Error GoTo 0 30 31 ' 貼り付け対象セルが取得できない場合は処理終了 32 If activeCell Is Nothing Then 33 MsgBox "セルが選択されていないため処理を継続できません", vbExclamation + vbOKOnly, "処理失敗" 34 Exit Sub 35 36 End If 37 38 ' CSVファイルパスを取得 39 csvBookPath = Application.GetOpenFilename(FileFilter:="CSV ファイル, *.csv?") 40 41 ' CSVファイルパスが入力されなかった場合は処理終了 42 If csvBookPath = "" Then 43 MsgBox "CSVファイルが選択されなかったので処理を終了します", vbExclamation + vbOKOnly, "処理失敗" 44 Exit Sub 45 46 End If 47 48 ' 処理高速化のために画面描画をオフ 49 Application.ScreenUpdating = False 50 51 ' CSVファイルを開く 52 Set csvBook = GetCsvBook(csvBookPath) 53 54 ' CSVファイルが開けなかった場合は処理終了 55 If csvBook Is Nothing Then 56 MsgBox "CSVファイルを開けなかったので処理を終了します", vbExclamation + vbOKOnly, "処理失敗" 57 58 ' 画面描画を再開 59 Application.ScreenUpdating = True 60 Exit Sub 61 62 End If 63 64 ' CSVデータが記載されたシートを取得 65 Set csvSheet = csvBook.Worksheets(1) 66 67 ' アクティブシートのロックを解除 68 activeWorksheet.Unprotect 69 70 ' CSVの内容をアクティブシートに貼り付け 71 With csvSheet.UsedRange 72 csvSheet.Range(csvSheet.Cells(IIf(NEED_HEADER, 1, 2), 1), .Cells(.Cells.Count)).Copy activeCell 73 End With 74 75 ' CSブックを閉じる 76 csvBook.Close False 77 78 ' アクティブシートのロックを実施 79 ProtectSheet ActiveSheet 80 81 ' 画面描画を再開 82 Application.ScreenUpdating = True 83 84End Sub 85 86' CSVファイルのデータを一括削除 87' (但し柔軟性を持たせるために選択した範囲のみを削除できるようにする) 88Public Sub DeleteCsvData() 89 90 ' 変数宣言 91 Dim activeWorksheet As Worksheet 92 Dim activeCell As Range 93 94 ' 削除処理を実施して良いかの確認ダイアログ 95 ' (NO が選択された場合は処理終了) 96 If MsgBox("選択されたセル削除してよろしいですか?", vbQuestion + vbYesNo, "確認") = vbNo Then 97 Exit Sub 98 End If 99 100 ' アクティブシートを取得 101 Set activeWorksheet = ActiveSheet 102 103 ' 削除対象セルを取得 104 On Error Resume Next 105 Set activeCell = Selection 106 On Error GoTo 0 107 108 ' 削除対象セルが取得できない場合は処理終了 109 If activeCell Is Nothing Then 110 MsgBox "セルが選択されていないため処理を継続できません", vbExclamation + vbOKOnly, "処理失敗" 111 Exit Sub 112 End If 113 114 ' 処理高速化のために画面描画をオフ 115 Application.ScreenUpdating = False 116 117 ' アクティブシートのロックを解除 118 activeWorksheet.Unprotect 119 120 ' 選択されたセルを削除 121 ' (空行ができないように削除された箇所以降を上にシフト) 122 activeCell.Delete xlShiftUp 123 124 ' アクティブシートのロックを実施 125 ProtectSheet ActiveSheet 126 127 ' 画面描画を再開 128 Application.ScreenUpdating = True 129 130End Sub 131 132' シートをロック(許可したい操作によってここの処理は変更してください) 133Private Sub ProtectSheet(ByRef pSheet As Worksheet) 134 135 With pSheet 136 .Protect 137 End With 138 139End Sub 140 141' CSVブックを開く(失敗した場合は Nothing を返却) 142Private Function GetCsvBook(ByRef path As String, Optional password As String = "") As Workbook 143 144 ' 変数宣言 145 Dim book As Workbook 146 147 ' ブックを開く 148 On Error Resume Next 149 Set book = Workbooks.Open( _ 150 Filename:=path, _ 151 UpdateLinks:=0, _ 152 ReadOnly:=True, _ 153 password:=password, _ 154 IgnoreReadOnlyRecommended:=True, _ 155 AddToMru:=False) 156 On Error GoTo 0 157 158 ' 結果返却 159 Set GetCsvBook = book 160 161End Function 162

投稿2018/01/06 13:26

yamashita_yuich

総合スコア316

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

15DB109_hotaka

2018/01/06 18:11

ありがとうございます!コメントまでほんとにわかりやすく、初心者の私にはとても嬉しいです。 試してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問