[[20160225123923]] 『チェックボックスを含む表』(北国) >>BOT

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『チェックボックスを含む表』(北国)

チェックボックスを含む表を作成しました。チェックが多数存在し、チェック有と無しがあります。このシートを別ブックにコピーして貼り付ける作業をマクロでと考えているのですが、手作業でマクロの記録をするとチェックボックスだけコピーされて、表の方は貼り付けできませんでした。
表もチェックボックスも違うブックのシートに貼り付けするにはどうすればよろしいでしょうか

< 使用 Excel:Excel2013、使用 OS:Windows7 >


 シート毎コピーされてはいかがですか?
(稲葉) 2016/02/25(木) 12:45

シートにマクロがありそれも一緒にコピーされてしまうのを避けたかったのですが可能でしょうか。
記入用のものを別ブックにデータとして保存するですが、毎日1シートずつ増えるので出来るだけ軽くしようと考えています。
エクセルで保存することで後で修正も可能になるようにと思っているのですが、データとして保存するところで躓いています
(北国) 2016/02/25(木) 12:54

[[20160223105743]] 『チェックボックスのリンクセルの設定』(北国)

 前回もお答えしましたが、
 >毎日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

ありがとうございます。
こういったところがないと、行き詰って結局何もしないで終わるところでした
(北国) 2016/02/25(木) 16:32

 【事前準備】
 頂いたレイアウトを基に、データを入れました。
 入れるセルは分かりませんでしたので、適当に補完しました。
 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

おおおおおお
素晴らしい ありがとうございます。
この方法で構築していきたいと思います。
もの凄く助かりました
(北国) 2016/02/26(金) 13:03

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.