[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『チェックボックスを含む表』(北国)
チェックボックスを含む表を作成しました。チェックが多数存在し、チェック有と無しがあります。このシートを別ブックにコピーして貼り付ける作業をマクロでと考えているのですが、手作業でマクロの記録をするとチェックボックスだけコピーされて、表の方は貼り付けできませんでした。
表もチェックボックスも違うブックのシートに貼り付けするにはどうすればよろしいでしょうか
< 使用 Excel:Excel2013、使用 OS:Windows7 >
シート毎コピーされてはいかがですか? (稲葉) 2016/02/25(木) 12:45
前回もお答えしましたが、 >毎日1シートずつ増えるので出来るだけ軽くしようと考えています。
という目的でしたら、入力フォーマットは1シート データは1行1データとして残しておけば、今回のようなケースはありませんよ。
チェックボックスもリンク先のデータだけTrue/Falseとして値を保持し、書き戻すだけでよいのですから。
このまま押しとおすとされても、記録されたコードも、どのような表になっているのかもわからないので 答えようがありません。
シートモジュールのマクロについても、コピー後に実行されないような仕組みにすればよいのでは?
(稲葉) 2016/02/25(木) 13:02
Sub Macro1()
'
' Macro1 Macro
'
'
Sheets("sheet ").Select ActiveSheet.CheckBoxes.Add(20.25, 95.25, 37.5, 19.5).Select ActiveSheet.CheckBoxes.Add(445.5, 486, 37.5, 11.25).Select ActiveSheet.CheckBoxes.Add(445.5, 497.25, 37.5, 11.25).Select ActiveSheet.CheckBoxes.Add(140.25, 571.5, 37.5, 11.25).Select ActiveSheet.CheckBoxes.Add(213.75, 1021.5, 37.5, 11.25).Select ActiveSheet.CheckBoxes.Add(291.75, 1009.5, 37.5, 11.25).Select ActiveSheet.CheckBoxes.Add(291.75, 1020.75, 37.5, 11.25).Select ActiveSheet.CheckBoxes.Add(368.25, 1009.5, 37.5, 11.25).Select ActiveSheet.CheckBoxes.Add(368.25, 1021.5, 37.5, 11.25).Select ActiveSheet.CheckBoxes.Add(291.75, 984.75, 37.5, 11.25).Select ActiveSheet.CheckBoxes.Add(291.75, 996, 37.5, 11.25).Select ActiveSheet.CheckBoxes.Add(445.5, 1009.5, 37.5, 11.25).Select ActiveSheet.Buttons.Add(539.25, 39, 53.25, 22.5).Select ActiveSheet.Buttons.Add(540.75, 9, 50.25, 22.5).Select ActiveSheet.Buttons.Add(522.75, 314.25, 54, 36).Select ActiveSheet.Buttons.Add(522.75, 425.25, 53.25, 35.25).Select ActiveSheet.Buttons.Add(522.75, 534.75, 52.5, 35.25).Select ActiveSheet.Buttons.Add(522.75, 837.75, 54, 36).Select ActiveSheet.Buttons.Add(523.5, 946.5, 51, 38.25).Select ActiveSheet.Buttons.Add(522.75, 1058.25, 54, 36).Select ActiveSheet.Buttons.Add(522.75, 1168.5, 54, 36).Select ActiveSheet.Buttons.Add(522.75, 1278.75, 54, 36).Select ActiveSheet.Buttons.Add(522.75, 1389, 54, 36).Select ActiveSheet.Buttons.Add(522.75, 1499.25, 54, 36).Select ActiveSheet.Buttons.Add(522.75, 1609.5, 54, 36).Select Sheets("sheet ").Copy After:=Workbooks("data.xls").Sheets(3) Windows("管理者日誌.xls").Activate End Sub Sub Macro4()
' Macro4 Macro
Range("A1:L64").Select Selection.Copy Windows("data.xls").Activate ActiveSheet.CheckBoxes.Add(20.25, 95.25, 37.5, 19.5).Select ActiveSheet.CheckBoxes.Add(20.25, 114.75, 54.75, 15.75).Select ActiveSheet.CheckBoxes.Add(171.75, 117.75, 51, 11.25).Select ActiveSheet.CheckBoxes.Add(318, 114.75, 48.75, 15.75).Select ActiveSheet.Paste ActiveWindow.ScrollColumn = 2 ActiveWindow.ScrollColumn = 3 ActiveWindow.ScrollColumn = 2 ActiveWindow.ScrollColumn = 1 End Sub
もっと長いコードで ActiveSheet.CheckBoxes.Addがもっとたくさんあるのですが、全部記入するとここに載せれないようなので省略しました
(北国) 2016/02/25(木) 13:28
>手書きの日誌をパソコンで入力しようと思い作成をしています。 >表自体を変えることはできないので、
何度も何度も説明しますが、表を変えろなんて一言も言ってません。 「リンクさせたセルの値」をデータベースとして残しておいて、書き戻す方法では何故だめなのか教えてください。
テストマクロ作りましたので、検討してみてください。 1)新しいシートを一つ作ってください。 2)そこにチェックボックスフォームを一つ置いて、A1とリンクさせてください。 3)標準モジュールを挿入し、以下のコードを張り付けてください。
Sub test() Range("A1") = IIf(Range("A1"), False, True) End Sub
4)フォームボタンを設置し、3)のマクロを登録してください。 5)4)のボタンをクリックするたびに、チェックボックスのレ点が付いたり消えたりすることを確認してください。
このようにして、True/Falseのデータを残しておけば、後で変更することも容易にできますよね?
必要なデータが入力されているセルアドレスだけ分かれば叩き台だけでも作るので [[20110209184943]] 『[談]シートレイアウトの投稿どうしてますか?』(momo) こちらのユーティリティを使って、詳細なレイアウトを提示してください。 (稲葉) 2016/02/25(木) 14:18
|[A] |[B]|[C]|[D]|[E] |[F] |[G]|[H]|[I] |[J]|[K]|[L] [1]|管理者日誌| | | |印 |平成28年2月25日木曜日| | | | | | [2]| | | | | |住所 | | | | | | [3]| | | | |より | | | | | | | [4]| | | | |まで | | | | | | | [5]|氏名 | | | | |会社名 | | | | | | [6]|理由 □ |□ | □|□ | | □ |□ |□ |□ □ |□ |□ | [7]| | | | |) (| | |) | (| |) | [8]|その他 | | | | | | | | | | |
四角がチェックボタンです
フォームボタンを設置して消えたりする確認が出来ました。
これでチェックボックスのデータをtureなどを残して、過去にさかのぼって訂正する場合は、このデータを使えばよいということですね。
(北国) 2016/02/25(木) 14:59
>これでチェックボックスのデータをtureなどを残して、過去にさかのぼって訂正する場合は、このデータを使えばよいということですね。 そういうことです!! 分かってもらえてありがたい。
レイアウト提示してもらいましたので、あとは必要なデータを入れたり出したりするわけですが 頂いたレイアウトは結構煩雑なので、叩き台を作ったあと訂正してもらう必要がありそうです。
また、データベースの特性上、一意の値「主キー」が必要になります。 通し番号出会ったり、日付+時刻であったり 特に要望が無ければ通し番号で登録出来るようにします。
チェックボックスがリンクされているセル情報も必要です。
叩き台だけ簡単に作成してみます。 (稲葉) 2016/02/25(木) 15:38
【事前準備】 頂いたレイアウトを基に、データを入れました。 入れるセルは分かりませんでしたので、適当に補完しました。 N,O,P列にとりあえずチェックボックスをリンクさせました。 新しいブックを用意して、シートを二つ挿入してください。(Sheet1,Sheet2) Sheet1
|[A] |[B] |[C]|[D]|[E] |[F] |[G]|[H]|[I] |[J]|[K]|[L]|[M]|[N] |[O] |[P] [1] |管理者日誌| | | |印 |平成28年2月25日木曜日 | | | | | | | | | | [2] | 1| | | | |住所 | | | | | | | | | | [3] | | | | |より |東京都千葉区さいたま町| | | | | | | | | | [4] | | | | |まで | | | | | | | | | | | [5] |氏名 |伊東 四朗 | | | |会社名 | | | | | | | | | | [6] |理由 レ |レ | □|□ | | □ |□ |□ |□ □ |□ |□ | | |TRUE|Ture|FALSE [7] | | | | |) (|?鰍「とーしろー | |) | (| |) | | | | | [8] |その他 |コメディアン| | | | | | | | | | | | | | [9] | | | | | | | | | | | | | | | | [10]| | | | | | | | | | | | | | | | [11]| | | | | | | | | | | | | | | | [12]| | | | | | | | | | | | | | | |
1行目にSheet1の取り込みたいセル番地、 2行目に項目名を入れてください。(項目名は分かりやすくするためです。)
Sheet2 |[A] |[B] |[C] |[D] |[E] |[F] |[G] |[H] |[I] |[J] [1]|A2 |F1 |F3 |F7 |B5 |B8 |N6 |O6 |P6 | [2]|通し番号|日付|住所|会社名|氏名|その他|chk01|chk02|chk03| [3]| | | | | | | | | |
次の投稿でコードと実例を説明します。 (稲葉) 2016/02/25(木) 17:26
標準モジュールを挿入し、以下のコードを入れてください。 Option Explicit '=====共通の変数=================================== Private WS1 As Worksheet 'フォーマットのシート Private WS2 As Worksheet ' Private Adr As Variant 'フォーマットのデータ入力セルアドレスを配列で取得 '==================================================
'=====フォーマットに入力されたデータをデータシートに転記するプロシジャ= Sub 転記() '================================================== Dim x Dim ans() Dim cnt As Long Dim F As Range Call mySetting ReDim ans(UBound(Adr)) With WS1 For Each x In Adr ans(cnt) = .Range(x).Value cnt = cnt + 1 Next x End With With WS2 Set F = GetNum(ans(0)) If F Is Nothing Then If MsgBox("新規登録します。よろしいですか?", vbYesNo) = vbYes Then .Cells(.Rows.Count, "A").End(xlUp).Offset(1).Resize(, UBound(ans) + 1).Value = ans End If Else If MsgBox(ans(0) & "は既に登録されています。上書きしますか?", vbYesNo) = vbYes Then F.Resize(, UBound(ans) + 1).Value = ans End If End If End With End Sub
'=====登録したデータをフォーマットに戻すプロシジャ= Sub 書き戻し() '================================================== Dim n As String Dim F As Range Dim i As Long Dim x Call mySetting ReDim ans(UBound(Adr)) n = InputBox("戻したい通し番号を入力してください") If n <> "" Then Set F = GetNum(n) If F Is Nothing Then MsgBox "入力された通し番号は見つかりませんでした。" Else If MsgBox("データが見つかりました。" & vbNewLine & _ "現在フォーマットに入力されているデータは保存していなければ復元できません。" & vbNewLine & _ "よろしいですか?", vbYesNo) = vbYes Then With WS2 For i = 1 To UBound(Adr) WS1.Range(Adr(i)).Value = F.Offset(, i - 1).Value 'FがA列なので、OffsetせずA列の値を入れる Next i End With MsgBox "出力完了しました。" End If End If End If End Sub
'=====共通の変数をセットするプロシジャ============= Private Sub mySetting() '================================================== Set WS1 = Sheets("Sheet1") Set WS2 = Sheets("Sheet2") Adr = Application.Transpose(Application.Transpose(WS2.Range("A1", WS2.Cells(1, WS2.Columns.Count).End(xlToLeft)).Value)) End Sub
'=====通し番号を検索するユーザー関数=============== Private Function GetNum(w As String) As Range '================================================== With WS2 Set GetNum = _ .Range("A:A").Find( _ What:=w, _ After:=.Range("A1"), _ LookIn:=xlFormulas, _ LookAt:=xlWhole, _ SearchOrder:=xlByRows, _ SearchDirection:=xlNext, _ MatchCase:=False, _ MatchByte:=False, _ SearchFormat:=False) End With End Function
【使い方】 「転記」を実行すると、Sheet1に入力されているデータが、Sheet2の1行目に入力されているアドレスに 従って、Sheet2に転記されます。
「書き戻し」を実行すると、通し番号を聞かれ、登録された通し番号を入力すると、Sheet2から Sheet1にデータを書き戻します。
この仕様でよろしければ、少しずつブラッシュアップしていきましょう。 (稲葉) 2016/02/25(木) 17:29
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.