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

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

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

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

Q&A

解決済

1回答

660閲覧

マクロを使った進捗管理表について

monaxia2416

総合スコア1

VBA

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

0グッド

0クリップ

投稿2025/05/08 22:32

編集2025/05/15 14:16

実現したいこと

マクロ初心者で、以前勤務していた同僚がつくった別件のコードを参考にして作成しています。進捗管理表作成のため、下記②のコードを入力中です(①②ともマクロを起動させるボタンは「元データ」シートに表示しています)。

①別のexcelファイルから「元データ」シートへA~M列のデータを抽出し(マクロ完成済)、②N~R列のデータを手入力した後「進捗管理表」シートにA~R列を(複数行同時に)転記(S~V列はこの段階でまだ未確定なのでブランク)、③後日、S~V列を「進捗管理表」シートに直に手入力するのが一連の作業です。

[A][B][C][D][E][F][G][H][I][J][K][L][M] (抽出)
[N][O][P][Q][R](手入力)
-----ここまでを「元データ」シートから「進捗管理表」シートへ転記
[S][T][U][V](後日直に手入力)
※「元データ」シートでは、A5が起点で、「進捗管理表」シートでは、A2が起点ですが、保存したい内容は全く同じです。

現在その進捗管理表は通常のexcelファイルで運用しているのですが、操作が苦手な同僚が、行や列をうっかり削除してしまったり、誤って別のセルを上書きしてしまうミスが続いており、入力済の部分に触れずにデータを更新できないかと考えています。このため、シートの保護&解除のコードを追加しています。アドバイスをいただけると幸いです。

発生している問題・分からないこと

データが転記されません。

エラーメッセージ

error

1Range’メソッドは失敗しました:’_Worksheet’オブジェクト

該当のソースコード

VBA

1Dim ws1 As Worksheet, ws2 As Worksheet 2Set ws1 = ThisWorkbook.Worksheets("元データ") 3Set ws2 = ThisWorkbook.Worksheets("進捗管理表") 4Dim cmax As Long 5cmax = ws2.Range(“A”&Rows.Count).End(xlUp).Row+1 6ws2.Unprotect 7ws2.UsedRange.Locked = True 8ws2.Range(“A”&cmax).Resize(196,18).Value = ws1.Range(“A5:R200”).Value 9ws2.Range(“S”&cmax).Resize(196,4).Locked = False 10ws2.Protect

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

With ws2~End Withを使用するとエラーは出ないのですが、やはりデータは転記されません。

補足

N~V列を修正したいときのために、下記のコードを別に登録しています。マクロを起動させるボタンは「進捗管理表」シートに表示しています。

Sub sample()
Dim sh, alert
alert = MsgBox(“N~V列を編集可能にしますか?”, vbQuestion & vbYesNo)

If alert = vbYes Then
Set sh = Sheets(“進捗管理表”)
sh.Unprotect
sh.Range(“N1:V”&Rows.Count).Locked = False
sh.Protect
Set sh = Nothing
End If
End Sub

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

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

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

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

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

Refrain

2025/05/08 23:21

エラーはどこで発生したか分かりますか?
tatsu99

2025/05/09 02:57 編集

>N~V列を修正したいときのために、下記のコードを別に登録しています。 >Set sh = Sheets(“工程管理表”) "進捗管理表"の他に“工程管理表”のシートもあるのでしょうか。 これは、"進捗管理表"の誤りではないでしょうか。 上記の他に sh.Range(“N:V”&Rows.Count).Locked = False の個所でエラーが発生します。 この提示されたスクリプトは、実際に動作していますか。
meg_

2025/05/09 03:56

該当のソースコードを試しましたが「Range’メソッドは失敗しました」のエラーは発生しませんでした。「該当のソースコード」で本当にエラーは発生しましたか?
monaxia2416

2025/05/09 10:46 編集

お返事遅くなり申し訳ありません。 Refrainさま、meg_さま すみません。もう一度確認したら、エラーは発生しませんでした。が、やはりデータは転記されませんでした。ただ、「進捗管理表」シートの保護を解除した後、「元データ」シートに戻って②を起動するボタンを押すと、「進捗管理表」シートに保護がかかるため、保護の動作は有効になってるみたいです。 tatsu99さま すみません。”進捗”管理表の間違いです(>__< ご指摘のとおりエラーが発生しましたw
sk.exe

2025/05/09 10:23 編集

> ①②ともマクロを起動させるボタンは「元データ」シートに表示 そもそも、「②を起動させるボタンを押した時に」そのマクロが 実際に呼び出されていることを正しく確認できているのでしょうか。 > エラーは発生しませんでした。が、やはりデータは転記されませんでした。 > 「進捗管理表」シートを保護にした後、「元データ」シートに戻って > ②を起動するボタンを押すと、「進捗管理表」シートに保護がかかる [進捗管理表]に最初から保護が掛かっていて、かつボタンをクリックしても 実際にはそのマクロが実行されていないのであれば、そういう結果にはなる (というか、何の変化も起こっていない)でしょうけど。 もしその辺りを十分に確認できていないのであれば、とりあえず ②のプロシージャの宣言部分をブレークポイントに設定した上、 「②を起動させるボタン」をクリックしてみて下さい。 設定されたブレークポイントでコードの実行が一時停止しないのであれば、 そのボタンとマクロの紐づけが正しく行われていないだけなのではないかと。
monaxia2416

2025/05/09 12:18 編集

sk.exeさま ご返信ありがとうございます。「「進捗管理表」シートの保護を解除した後、~」でした…たびたびすみません。下記教えていただいたコードも含めて週明けに確認してみます。
meg_

2025/05/09 11:31

> すみません。もう一度確認したら、エラーは発生しませんでした。が、やはりデータは転記されませんでした。 こちらではデータ転記されます。該当のソースコードのみのマクロファイルを作成して、元データシートにダミーのデータを入力してデータが転記されることを確認されてはどうでしょうか?
monaxia2416

2025/05/09 11:48

meg_さま ご返信ありがとうございます。どうやら初歩的なことでつまづいているようですね…週明けに作り直してみます。
monaxia2416

2025/05/15 13:46 編集

みなさま、お騒がせしました。 職場のパソコンにインストールされているのがOffice2016だったので、どうやら互換性の問題だったようです…。 ところで「進捗管理表」シートの方で、S~V列を手入力した後、入力済みのセルを保護するため、補足欄に記載したコードを下記のとおり修正して追加してみたのですが、うまくいきません…(エラーは出ないのですが、手入力したセルが保護されていないようです)。 (3行目)alert = MsgBox(“空白セル以外をロックしますか?”, vbQuestion & vbYesNo) (7行目)sh.UsedRange.SpecialCells(xlCellTypeBlanks).Locked = False ↑該当のソースコードに記載した9行目をこのUsedRange~に修正したら正しく動作します。
guest

回答1

0

ベストアンサー

N~R列のデータを手入力した後「進捗管理表」シートにA~R列を(複数行同時に)転記

「元データ」シートでは、A5が起点で、「進捗管理表」シートでは、A2が起点です

行や列をうっかり削除してしまったり、誤って別のセルを上書きしてしまうミスが続いており、入力済の部分に触れずにデータを更新

vba

1Sub CopySourceData() 2 3 Dim wsSource As Worksheet 4 Dim rngSource As Range 5 Dim lngStartRow As Long 6 Dim lngLastRow As Long 7 8 Set wsSource = ThisWorkbook.Worksheets("元データ") 9 10 With wsSource 11 12 lngStartRow = 5 13 lngLastRow = .Cells(.Rows.Count, "A").End(xlUp).Row 14 15 If lngStartRow > lngLastRow Then 16 MsgBox "データ行が見つかりません。" & vbCrLf & lngStartRow & "行目以降のA列の内容を確認して下さい", _ 17 vbInformation, _ 18 "複写対象データなし" 19 Set wsSource = Nothing 20 Exit Sub 21 End If 22 23 Set rngSource = .Range(.Cells(lngStartRow, "A"), _ 24 .Cells(lngLastRow, "R")) 25 26 End With 27 28 Dim wsDestination As Worksheet 29 Dim lngTargetRow As Long 30 31 Set wsDestination = ThisWorkbook.Worksheets("進捗管理表") 32 33 With wsDestination 34 35 lngTargetRow = .Cells(.Rows.Count, "A").End(xlUp).Row + 1 36 37 .Unprotect 38 .UsedRange.Locked = True 39 40 .Cells(lngTargetRow, "A").Resize(rngSource.Rows.Count, _ 41 rngSource.Columns.Count).Value = rngSource.Value 42 .Cells(lngTargetRow, "S").Resize(rngSource.Rows.Count, 4).Locked = False 43 44 .Protect 45 46 .Select 47 .Cells(lngTargetRow, "S").Select 48 49 End With 50 51 Set rngSource = Nothing 52 Set wsSource = Nothing 53 Set wsDestination = Nothing 54 55End Sub

N~V列を修正したいときのために、下記のコードを別に登録しています。
マクロを起動させるボタンは「進捗管理表」シートに表示しています。

vba

1Sub UnlockInputColumnsOfProgressSheet() 2 3 Dim lngAnswer As Long 4 5 lngAnswer = MsgBox("N~V列を編集可能にしますか?", _ 6 vbQuestion + vbYesNo + vbDefaultButton2, _ 7 "確認") 8 9 If lngAnswer = vbNo Then 10 Exit Sub 11 End If 12 13 With ThisWorkbook.Worksheets("進捗管理表") 14 .Unprotect 15 .Range("N2:V" & .Rows.Count).Locked = False 16 .Protect 17 End With 18 19 MsgBox "N~V列のロックを解除しました。", _ 20 vbInformation, _ 21 "解除完了" 22 23End Sub

投稿2025/05/09 04:08

編集2025/05/09 09:54
sk.exe

総合スコア1082

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問