[[20150225213651]] 『ユーザーフォームから別ファイルへ転記したい』(ちぃちゃん) ページの最後に飛ぶ

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

 

『ユーザーフォームから別ファイルへ転記したい』(ちぃちゃん)

 こんばんは。

 今回初めてユーザーフォームを使ってみたいと思っています。
 ユーザーフォーム内には、テキストボックス・コマンドボタン・
 フレーム内にオプションボタンを配置しています。

 やりたい事は、ユーザーフォーム内のテキストボックスに入力した値や、
 オプションボタンで選択した種類(済/未)をコマンドボタンを押して、
 別ファイルAAA.xlsm/別ファイルBBB.xlsmの2つのファイルにそれぞれ
 転記したり合計値を入力したいと思っています。

 ファイルAAA.xlsmの場合は下の様な表になっていて、一番下(13行目)に
 テキストボックス1の値をA列に、テキストボックス2の値をB列に、
 テキストボックス3の値をC列にという様に転記したいです。

【ファイルAAA.xlsm】

     |[A]     |[B]    |[C]    |[D]    |[E]    |[F]    |[G]     
 [8] |        |ランクA|ランクB|ランクC|ランクD|ランクE|ランク外
 [9] |12345678|    100|     89|    333|     56|     44|      15
 [10]|11223344|     78|     25|    321|     48|     69|      12
 [11]|12457812|    123|     39|    125|     69|     36|       0
 [12]|14725836|    210|     88|    211|     57|     25|      11
 [13]|        |       |       |       |       |       |        
 [14]|        |       |       |       |       |       |        

 ファイルBBB.xlsmの場合は下の様な表になっていて、一番下(25行目)に
 テキストボックス1の値をA列に、テキストボックス2〜テキストボックス6
 までの合計値をC列に入力し、オプションボタンで選択された種類(済/未)
 をB列に転記したいと思っています。

【ファイルBBB.xlsm】

     |[A]     |[B] |[C]   
 [20]|        |報告|出荷数
 [21]|12345678|済  |   622
 [22]|11223344|済  |   541
 [23]|12457812|未  |   392
 [24]|14725836|済  |   591
 [25]|        |    |      
 [26]|        |    |           

 ご教授頂ける方、宜しくお願い致します。

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


 OPtionButtonですか?CheckBoxのほうがいいかも。
 ともあれ、以下ではいかがですか?

 Private Sub CommandButton1_Click()
    Dim myRow As Long
    Dim tot As Long
    Dim i As Long

    'AAA処理
    With Workbooks("AAA.xlsm").Sheets("Sheet1")     '★シート名は実際のものに
        myRow = .Range("A" & Rows.Count).End(xlUp).Offset(1).Row
        .Range("A" & myRow).Value = TextBox1.Value
        .Range("B" & myRow).Value = TextBox2.Value
        .Range("C" & myRow).Value = TextBox3.Value
    End With

    'BBB処理
    With Workbooks("BBB.xlsm").Sheets("Sheet1")     '★シート名は実際のものに
        myRow = .Range("A" & Rows.Count).End(xlUp).Offset(1).Row
        .Range("A" & myRow).Value = TextBox1.Value
        For i = 2 To 6
            tot = tot + Val(Controls("TextBox" & i).Value)
        Next
        .Range("C" & myRow).Value = tot
        .Range("B" & myRow).Value = IIf(OptionButton1.Value, "済", "未")
    End With

 End Sub

(β) 2015/02/26(木) 09:18


 β様 こんばんは。
 返信ありがとうございます。

 教えて頂いたコードを試してみたところ、

 実行時エラー'424':
 オブジェクトが必要です。 というエラーが出て、デバッグを押すと、

 .Range("A" & myRow).Value = TextBox1.Value

 の部分が黄色くなっていました。

 試した方法は、ユーザーフォームのファイルを開いて、AAA.xlsmとBBB.xlsmの
 2つのファイルを開いた状態でコマンドボタンを押しました。
 何かやり方が間違っているのでしょうか?

(ちぃちゃん) 2015/02/26(木) 19:30


 ユーザーフォームに TextBox1 は存在しますか?

 あ、それと・・・念のためですが、このコードはユーザーフォームモジュールに記述しましたね?
 で、CommandButtonやOptionButtonやTextBoxは、すべてユーザーフォームのコントロールですが
 それはいいですね?(シートに挿入するコントロールではない)

(β) 2015/02/26(木) 21:07


 β様 早速の返信ありがとうございます。

 ご指摘の通りTextBox1が存在しませんでした。(変更してました><)
 変更した名前を戻すとバッチリ出来ました。ありがとうございました。

 ところで、
 >OPtionButtonですか?CheckBoxのほうがいいかも。
 というのはどういう理由でしょうか?
 今後の為に教えて頂ければ幸いです。

 宜しくお願い致します。
(ちぃちゃん) 2015/02/26(木) 22:52

 OptionButtonがダメということではないです。
ただ、「三者以上択一」の時には、OptionButtonが必須ですけど、「二者択一」なら
どちらかといえば CheckBoxが、より適しているかなと。

 たとえば、エクセルのダイアログを見てみましょう。
ファイルタブのオプションを選んでみます。「Exclのオプション」画面が表示されますね。
その一番上に、

 □選択時にミニツールバーを表示する(M) というのがありますね。

 ここにチェックを入れると「表示する」、チェックを外すと「表示しない」という意味になります。

 OptinButtonをつかうと、このケースでは

 ○選択時にミニツールバーを表示する
 ○選択時にミニツールバーを表示しない

 こういった二行になって、どちらかを選び ●にすることになりますね。

 他のダイアログでも、たとえば検索と置換を選び、オプションをクリックすると、いろんな【二者択一】の選択条件が
チェックボックスで選ぶようになっていますね。

 ですから、今回の場合、

 □ 報告 済

 こんなキャプションのチェックボックスにしておいて、チェックが入っていれば 「済」、はいっていなければ「未」。
そういう扱いにしたほうがいいのかなと思いました。

 もし、そうされるなら

 .Range("B" & myRow).Value = IIf(OptionButton1.Value, "済", "未")

 ここを

 .Range("B" & myRow).Value = IIf(CheckBox1.Value, "済", "未")

 にかえればOKです。

(β) 2015/02/27(金) 07:20


 β様 こんばんは。
 返信ありがとうございます。

 OptionButtonとCheckBoxの使い分け・・・なるほど!と思いました。
 エクセルをベースに例を挙げて頂き、とても分かりやすかったです。

 今回は、CheckBoxを使うという発想が全く無くOptionButtonを使って
 いたのですが、CheckBoxの使い方を教えて頂き、変更するか否か少し
 悩みました。(CheckBoxの方が1行でスマートだし・・・)

 悩んだ結果、2行になってしまうけど、どちらを選択しているか
 (選択している方が)パッと見で分かるOptionButtonを使う事にしました。
 今後は、OptionButtonとCheckBoxの使い分けを分かった上で、どちらを
 使う方が分かりやすいか?という考えで、使い分けたいと思います。

 ありがとうございました。

(ちぃちゃん) 2015/02/27(金) 22:30


 こんばんは。
 再度質問させて下さい。

 ファイル名の前に 1503_ を付加しないといけなくなりました。

 ユーザーフォームに設置した、ファイルを開くボタンに紐づけたコードは下記で問題なく開きます。
 (ファイル名の前に、 (1503_) を付加。)・・・1503_ は年月です。(来月なら1504_BBBになります)

 Sub Macro1()
    Workbooks.Open Filename:="C:\Users\User\Desktop\" & Format(Now(), "yymm") & "_BBB.xlsm"
    Windows("ユーザーフォーム1.xlsm").Activate
    Range("A1").Select
 End Sub

 次に、1503_BBB.xlsmに教えて頂いたコードで転記したいのですが、ファイル名の指定の仕方
 (コードの書き方)が分かりません。

 ご教授頂けないでしょうか。
 宜しくお願い致します。

(ちぃちゃん) 2015/03/03(火) 23:06


 作成時、参照時に同じブックを相手にする方法はいろいろあります。
 ブックのオブジェクトを広域変数にいれておいて、それを参照するということもできますが
 ここでは、作成時、参照時に【同じブック名文字列】を使う方法を3つほど。

 1.一番単純な方法

 作成時のブック名を、Format(Now(), "yymm") & "_BBB.xlsm" としているわけだから、
 参照時も With Workbooks(Format(Now(), "yymm") & "_BBB.xlsm").Sheets("Sheet1")     

 デメリットとしては、この仕様が変更になった場合(たとえばブック名が 201503_BBB となった)
 2か所を忘れずに同じように修正必要。もし、3か所、4か所で参照していると、結構面倒。

 2.「広域変数」にブック名をいれておく。

 Macro1がある標準モジュールの、先頭の宣言部(どのマクロプロシジャより上の部分)に

 Public strBBB As String  と記述しておいて

 Workbooks.Open Filename:="C:\Users\User\Desktop\" & Format(Now(), "yymm") & "_BBB.xlsm"

 これを

 strBBB = Format(Now(), "yymm") & "_BBB.xlsm"
 Workbooks.Open Filename:="C:\Users\User\Desktop\" & strBBB

 参照時には With Workbooks(strBBB).Sheets("Sheet1") 

 デメリットは、どこかでエラーがあったり、あるいは、マクロを修正した場合に、マクロブック全体がリセットされ
 格納してあった strBBB変数の中身も空白になってしまうので、いったんエクセルを閉じて再度、最初から
 処理する必要がでてくる場合もある。

 3.上記の 1.、2.のデメリットを解消する案として。

 標準モジュールに

 Function getBBBname() As String
    getBBBname = Format(Now(), "yymm") & "_BBB.xlsm"
 End Function

 こんなファンクションプロシジャを書いておいて

 Workbooks.Open Filename:="C:\Users\User\Desktop\" & getBBBname

 With Workbooks(getBBBname).Sheets("Sheet1")

 ところで、

 Workbooks.Open Filename:="C:\Users\User\Desktop\" & Format(Now(), "yymm") & "_BBB.xlsm"

 この2番目の User は、実際には、PCのアカウントというかログインIDですよね?
 そうすると、PCごとに異なった値になるので、このマクロを別PCで動かすと、そんなパスは
 ないよ!というエラーになります。

 "C:\Users\User\Desktop\" この部分は、以下のように、パスを動的に取得しましょう。

 CreateObject("WScript.Shell").SpecialFolders("DeskTop") & "\"

 それと、Windows("ユーザーフォーム1.xlsm").Activate
 これは、マクロブックを最前面にだしているんだと思いますが、マクロブック名が変更になると
 ここも変更しなきゃいけない。

 ThisWorkbook.Activate にしておきましょう。

(β) 2015/03/04(水) 06:47


 β様 こんばんは。
 返信ありがとうございます。

 3通りも方法を提示して頂きありがとうございます。

 一番単純な方法・・・試してダメだったから質問させてもらったのに・・・
 どこかが間違ってたんですね(><)

 3番目のファンクションプロシージャって、初めて知りました。
 subから始まるプロシージャだけじゃなかったんですね。
 私には難しいけど、今回は1.2.のデメリットを解消できるとの事なので
 3番目の案を使用させて頂きたいと思います。

 又、使用するPCに影響されずにパスを取得する方法や、ThisWorkbook.Activate
 のアドバイスもありがとうございました。

 今後も助けてもらわないといけない時があるかと思いますが宜しくお願い致します。
 本当にありがとうございました。

(ちぃちゃん) 2015/03/04(水) 22:25


 こんばんは。

 以前教えて頂いた方法で上手く出来ていたのですが、今回作業方法が少し変更になり、
 それに対応するために新しくチェックボックスを使用したいと思っています。

 今回行いたいことは複雑なので、文章が少し長くなりますがお付き合いお願い致します。

 新しい作業というのは、【別ファイルAAA.xlsm】への転記と【別ファイルCCC.xlsm】
 への転記なのですが、今回は【別ファイルAAA.xlsm】への転記作業について質問
 させて頂き、それが解決したらその後に【別ファイルCCC.xlsm】への転記作業に
 ついて質問させて頂きたいと思います。

 ユーザーフォームのグループボックス内にチェックボックスを7つ追加で作成しており、
 チェックする場所によって転記方法を変えるというものです。チェックが1つだけの時は
 いいのですが、複数のチェックが入った時の転記が複雑になります。

【ファイルAAA.xlsm】

     |[A]     |[B]    |[C]    |[D]    |[E]    |[F]    |[G]    |[H]     |[I]      
 [8] |        |ランクA|ランクB|ランクC|ランクD|ランクE|ランクF|ランク外|ランク外2 
 [9] |12345678|    100|     89|    333|     56|     44|     15|      10|        2
 [10]|11223344|     78|     25|    321|     48|     69|     12|      13|        8
 [11]|12457812|    123|     39|    125|     69|     36|      0|       7|        7
 [12]|14725836|    210|     88|    211|     57|     25|     11|      21|        8

 【条件】
 1.チェックボックス1にチェックが入った時は、他のチェックボックスにチェックを
 入れると間違いなので、出来れば他のチェックボックスに チェック出来ない様に
 したいです。(普段は、チェックボックス1にチェックが入る事が殆どです。)

 2.チェックボックス1以外は、複数にチェックが入る可能性があるのでチェックが
 入った箇所は転記せずに、チェックが入っていない箇所のみ転記する様にしたいです。

 テキストボックスと列とチェックボックスとの関係は下記の様になっています。

 テキストボックス1 = A列 = チェックボックスなし
 テキストボックス2 = B列 = チェックボックス2
 テキストボックス3 = C列 = チェックボックス3
 テキストボックス4 = D列 = チェックボックス4
 テキストボックス5 = E列 = チェックボックス5
 テキストボックス6 = F列 = チェックボックス6
 テキストボックス7 = G列 = チェックボックス7
 テキストボックス8 = H列 = チェックボックスなし
 テキストボックス9 = I列 = チェックボックスなし

 【例】
 チェックボックス2とチェックボックス3にチェックが入った時は下記の様になります。

     |[A]     |[B]    |[C]    |[D]    |[E]    |[F]    |[G]    |[H]     |[I]      
 [8] |        |ランクA|ランクB|ランクC|ランクD|ランクE|ランクF|ランク外|ランク外2
 [9] |12345678|    100|     89|    333|     56|     44|     15|      10|        2
 [10]|11223344|     78|     25|    321|     48|     69|     12|      13|        8
 [11]|12457812|    123|     39|    125|     69|     36|      0|       7|        7
 [12]|14725836|    210|     88|    211|     57|     25|     11|      21|        8
 [13]|98765432|       |       |    123|     65|     22|     51|      13|        3

 【例2】
 チェックボックス2とチェックボックス3とチェックボックス5にチェックが入った時は
 下記の様になります。

     |[A]     |[B]    |[C]    |[D]    |[E]    |[F]    |[G]    |[H]     |[I]      
 [8] |        |ランクA|ランクB|ランクC|ランクD|ランクE|ランクF|ランク外|ランク外2
 [9] |12345678|    100|     89|    333|     56|     44|     15|      10|        2
 [10]|11223344|     78|     25|    321|     48|     69|     12|      13|        8
 [11]|12457812|    123|     39|    125|     69|     36|      0|       7|        7
 [12]|14725836|    210|     88|    211|     57|     25|     11|      21|        8
 [13]|98765432|       |       |    123|     65|     22|     51|      13|        3
 [14]|56987456|       |       |    326|       |     66|     41|      24|        6

 長々と書いてしまい分かりにくいかと思いますが、ご教授お願い致します。

(ちぃちゃん) 2015/04/29(水) 23:07


 転記先セルの指定記述方法を少し変えてみました。こんな書き方もあるというサンプルで。
 登場するチェックボックスやテキストボックスの数が多く、たまたま、その名前に【規則性】があるので
 ループ処理をさせているところがあります。
 コードは少なくなるメリットはありますが、逆にいえば、コントロール名を自由にかえることができないデメリットもあります。
 わかりにくければ、ループ処理をやめて、1行ずつのコード記述に変えることもできます。
 登録後、テキストボックスの値をクリアしていますが、値を残したければ、クリアしているコードを削除してください。

 Private Sub UserForm_Initialize()
    CheckBox1.Value = True
 End Sub

 Private Sub CheckBox1_Click()
    Dim i As Long

    'CheckBox1が選択   -->CheckBox2〜7 を未選択、かつ選択不可
    'CheckBox1が未選択 -->CheckBox2〜7 を選択可
    For i = 2 To 7
        Controls("CheckBox" & i).Enabled = Not CheckBox1.Value
        If CheckBox1.Value Then Controls("CheckBox" & i).Value = False
    Next

 End Sub

 Private Sub CommandButton1_Click()
    Dim i As Long

    If TextBox1.Value = "" Then
        MsgBox "●●が未入力です"
        TextBox1.SetFocus
        Exit Sub
    End If

    With Workbooks("AAA.xlsm").Sheets("Sheet1")     '★シート名は実際のものに
        With .Range("A" & Rows.Count).End(xlUp).Offset(1)
            .Range("A1").Value = TextBox1.Value
            .Range("H1").Value = TextBox8.Value
            .Range("I1").Value = TextBox9.Value
            For i = 2 To 7
                If Not Controls("CheckBox" & i).Value Then .Cells(1, i).Value = Controls("TextBox" & i).Value
            Next
        End With
    End With

    '登録後、TextBoxの値をクリア
    For i = 1 To 9
        Controls("TextBox" & i).Value = ""
    Next

 End Sub

(β) 2015/04/30(木) 07:00


 β様 こんばんは。
 いつもありがとうございます。

 だらだらと長い文章で分かりにくかったと思いますが、私がこうなってほしいと
 思っていたことが完璧に出来ていました。ありがとうございます。

 また、普段はチェックボックス1にチェックが入る事が殆どだという事で、
 初めからチェックボックス1にチェックが入っている様にまでして下さり
 こちらも感謝です。

 【別ファイルAAA.xlsm】は解決して頂けたので、次は【別ファイルCCC.xlsm】の
 方を質問させて頂きます。宜しくお願い致します。

 こちらも、チェックボックスのチェックの入り方によって転記方法が変わります。
 (別ファイルCCC.xlsmに対応させる為にチェックボックスは1〜8に変更しました)

 テキストボックスと列とチェックボックスとの関係は下記の様になっています。

 テキストボックス1 = A列 = チェックボックスなし
 テキストボックス2 = B列 = チェックボックス2
 テキストボックス3 = C列 = チェックボックス3
 テキストボックス4 = D列 = チェックボックス4
 テキストボックス5 = E列 = チェックボックス5
 テキストボックス6 = F列 = チェックボックス6
 テキストボックス7 = G列 = チェックボックス7
 テキストボックス8 = H列 = チェックボックス8
 テキストボックス9 = I列 = チェックボックスなし

     |[A]       |[B]    |[C]    |[D]    |[E]    |[F]    |[G]    |[H]     |[I]     
 [22]|バーコード|ランクA|ランクB|ランクC|ランクD|ランクE|ランクF|ランク外|保管場所
 [23]|1265895478|       |       |       |       |       |       |      88|        
 [24]|1452369874|       |       |       |       |       |       |      56|        
 [25]|1256325898|       |       |       |       |       |       |      64|        
 [26]|1254789632|       |       |       |       |       |       |      69|        
 [27]|1111111111|    213|       |       |       |       |       |        |A-1     
 [28]|1111111111|       |    154|       |       |       |       |        |B-1     
 [29]|1111111111|       |       |    229|       |       |       |        |C-1     
 [30]|1111111111|       |       |       |       |       |       |     125|        
 [31]|2222222222|    365|       |       |       |       |       |        |A-1     
 [32]|2222222222|       |    254|       |       |       |       |        |B-1     
 [33]|2222222222|       |       |    511|       |       |       |        |C-1     
 [34]|2222222222|       |       |       |       |       |    114|        |F-1     
 [35]|2222222222|       |       |       |       |       |       |      56|        

 上記23〜26行目は、チェックボックス1にチェックを入れて転記した状態です。(転記×4回)
 上記27〜30行目は、チェックボックス2・3・4・8にチェックを入れて転記した状態です。(転記×1回)
 上記31〜35行目は、チェックボックス2・3・4・7・8にチェックを入れて転記した状態です。(転記×1回)
 (I列の保管場所は手入力です)

 この様に、ランク別に保管場所が変わってくるので、チェックボックスに複数のチェックが
 入った時は、行をズラしていかないといけません。

 今回も長々となってしまい分かりにくいかもしれませんが、ご教授お願い致します。

(ちぃちゃん) 2015/04/30(木) 21:56


 同じユーザーフォームで AAA.xlsm と CCC.xlsm 両方に一度に対応ですか?
 それとも、AAA.xlsm 対応とは別の CCC.xlsm 対応専用のユーザーフォームですか?

 追記 たぶん、CCC.xlsm 専用でしょうね。

    で、ChekcBox1 は ランク外、(この時、CheckBox2〜8 は選べない)ということでいいですか?
    また、CheckBox2〜8 に対応する保管場所は固定でいいですか? (A-1 とか F-1 とか)

(β) 2015/04/30(木) 22:07


 β様 こんばんは。
 返信ありがとうございます。

 同じユーザーフォームで AAA.xlsm と CCC.xlsm 両方に一度で対応したいと思っています。
 (他に、同じユーザーフォームでBBB.xlsxとDDD.xlsxにも対応しています。)

 >で、ChekcBox1 は ランク外、(この時、CheckBox2〜8 は選べない)ということでいいですか?
 はい。その通りです。

 >また、CheckBox2〜8 に対応する保管場所は固定でいいですか? (A-1 とか F-1 とか)
 保管場所は都度変わります。

 宜しくお願い致します。

(ちぃちゃん) 2015/04/30(木) 22:21


 こんにちは。

 分かりにくい説明 & 複雑な作業という事で上記は難しそうなので、
 表のレイアウト変更や、CCC.xlsmのみ手入力で対応等の別の案で
 逃げたいと思います。

 別の案で行き詰った時には、又相談させて頂くかも知れませんが
 その時は宜しくお願い致します。

(ちぃちゃん) 2015/05/08(金) 11:43


 >別の案で 逃げたいと思います。

 もし、この理由が、(ちぃちゃん) 2015/04/30(木) 22:21 のアップ以来、βが 1週間以上、音沙汰なしだったからということであれば
 これは、ごめんなさいです。単に、本件を失念していただけ。(最近、とみに物忘れが多くなって)

 1つのフォームで複数ブック対応、もちろんできますよ。ただ、それを実行する条件を、いろいろと(ちぃちゃん) さんと
 取り決めていくことが必要ですが。

 どのブックを相手にするかということを、どう決めるかとか、それぞれの保管場所を、どう紐つけようとか。
 でも、それらは、決めればいいことですから。

 (ちぃちゃん) さんが、本当に、いったん、区切りをつけたい、しばらくは、このままでいい ということなら
 もちろん、それはそれでいいですが。

(β) 2015/05/08(金) 11:57


 β様 こんばんは。
 お返事ありがとうございます。

 実行する条件を色々と取り決めていく事で、私が希望している事が出来るなら
 是非進めていきたいですが、β様へかなりのご負担をかける事にならないでしょうか?

 β様が、「問題ないよ」と仰って頂けるなら是非お付き合い頂きたいです。

 宜しくお願い致します。

(ちぃちゃん) 2015/05/08(金) 17:29


 はい。問題はありません。

 ちょっと、こちらから確認したいことのまとめに時間ください。
 (今度は忘れないようにしますが、もし、もたもたしているようであれば、遠慮なく、せっついてくださいね)

(β) 2015/05/08(金) 17:52


 今までのことをなぞりながら整理中です。

 まず、確認したいことは、最初の AAA.xlsm と BBB.xlsm を相手にした処理。
 ユーザーフォームが書かれているマクロブックは、特に、特定していません。
 なんとなく、AAA.xlsm に書かれているのかなと想像していますが、これが
 BBB.xlsm に書かれていたとしても、CommandButton1_Click は、問題なく処理できますし
 あるいは、第3のマクロブック.xlsm に書かれていても、問題はありません。

 今後の CCC.xlsm や DDD.xlsm も見据えたとき、(ちぃちゃん)さんの構想では
 実際には、マクロブックは、どれになるでしょう。

 次に、

 >同じユーザーフォームで AAA.xlsm と CCC.xlsm 両方に一度で対応したいと思っています。
 >(他に、同じユーザーフォームでBBB.xlsxとDDD.xlsxにも対応しています。)

 このコメントが気になります。

 今までアップしたコードから、勝手に ユーザーフォーム --> AAA.xlsm と BBB.xlsm に転記。
 そう、理解していたんですが、そうではなく

 あるユーザーフォーム --> AAA.xlsm と CCC.xlsm あるいは AAA.xlsm ないしは CCC.xlsm
 別のユーザーフォーム --> BBB.xlsm と DDD.xlsm あるいは BBB.xlsm ないしは DDD.xlsm

 なのかなぁという気になってきました。

 うまく伝えられないかもしれないですけど、別の言い方をすると、今回、AAA.xlsm と CCC.xlsm 対応の
 処理をつくるとして、それには BBB.xlsm のことを忘れていいのかどうかということです。
 (いやいや、今度つくるマクロは ユーザーフォーム -->AAA.xlsm と BBB.xlsm と CCC.xlsm だということなら、それでもいいですよ)

 で、BBB.xlsm も相手にする場合は 済/未 のオプションボタンは必要なんですよね?

(β) 2015/05/08(金) 19:39


 追加で確認させてください。

(ちぃちゃん) 2015/04/30(木) 21:56 でアップされたレイアウトは CCC.xlsm で

 AAA.xlsm レイアウトは (ちぃちゃん) 2015/04/29(水) 23:07 でアップされたもの という理解でOKですか?

(β) 2015/05/08(金) 19:57


 矢継ぎ早の質問で心苦しいのですが・・・

 AAA.xlsm と CCC.xlsm への転記を1つのユーザーフォームで同時に行うということだと
 ユーザーフォームは1つですから、たとえば CheckBox1 も1つ、CheckBox8 も1つですよね。

 そうなると、CheckBox1 にチェックが入ると、AAA.xlsm には(既存のロジック)A列からI列まで、それぞれのTextBoxから値が転記されますね。
 で、CCC.xlsm へは 「 上記23〜26行目は、チェックボックス1にチェックを入れて転記した状態です。(転記×4回)」の例で示されているように
 A列とH列(TextBox9の入力があれば I列も)のみですよね。一方ではランクAからランクFまでに値が入るのに、一方ではランク外のみ?

 既存のコードでは CheckBox2 にチェックが【ついていなかったら】AAA.xlsmに転記。
 追加する CCC.xlsm には CheckBox2 にチェックが【ついていれば】CCC.xlsmに転記。

 う〜ん・・・わからなくなりました・・・

 何か根本的な勘違いをしているんでしょうか?

(β) 2015/05/08(金) 20:17


 β様 こんばんは。
 色々考えて下さりありがとうございます。

 >今後の CCC.xlsm や DDD.xlsm も見据えたとき、(ちぃちゃん)さんの構想では
 >実際には、マクロブックは、どれになるでしょう。
 第3のマクロブック.xlsmになります。

 >今までアップしたコードから、勝手に ユーザーフォーム --> AAA.xlsm と BBB.xlsm に転記。
 >そう、理解していたんですが、そうではなく
 >あるユーザーフォーム --> AAA.xlsm と CCC.xlsm あるいは AAA.xlsm ないしは CCC.xlsm
 >別のユーザーフォーム --> BBB.xlsm と DDD.xlsm あるいは BBB.xlsm ないしは DDD.xlsm
 >なのかなぁという気になってきました。
 第3のマクロブック.xlsmに作成したユーザーフォームへ入力し、転記ボタンを押す事で
 AAA.xlsm / BBB.xlsm / CCC.xlsm / DDD.xlsm へと、4つのブックへ転記する様にしています。

 >それには BBB.xlsm のことを忘れていいのかどうかということです。
 ご指摘ありがとうございます。気付けていませんでしたが、今回の仕様変更する事によって
 BBB.xlsmへの処理も変わり、現在のままでは修正が必要な事に気付けました。
 この件も、別途併せてご教授頂きたいです。

 >(ちぃちゃん) 2015/04/30(木) 21:56 でアップされたレイアウトは CCC.xlsm で 
 >AAA.xlsm レイアウトは (ちぃちゃん) 2015/04/29(水) 23:07 でアップされたもの という理解でOKですか?
 はい。その通りです。

 >AAA.xlsm と CCC.xlsm への転記を1つのユーザーフォームで同時に行うということだと
 >ユーザーフォームは1つですから、たとえば CheckBox1 も1つ、CheckBox8 も1つですよね。
 はい。その通りです。

 >そうなると、CheckBox1 にチェックが入ると、AAA.xlsm には(既存のロジック)A列からI列まで、それぞれのTextBoxから値が転記されますね。
 >で、CCC.xlsm へは 「 上記23〜26行目は、チェックボックス1にチェックを入れて転記した状態です。(転記×4回)」の例で示されているように
 >A列とH列(TextBox9の入力があれば I列も)のみですよね。一方ではランクAからランクFまでに値が入るのに、一方ではランク外のみ?
 はい。その通りです。
 とてもややこしいのですが、チェックボックスについてこの後説明させて頂きます。

 >既存のコードでは CheckBox2 にチェックが【ついていなかったら】AAA.xlsmに転記。
 >追加する CCC.xlsm には CheckBox2 にチェックが【ついていれば】CCC.xlsmに転記。
 >う〜ん・・・わからなくなりました・・・
 チェックボックス1〜8の説明が出来ておらず紛らわしくなってしまい申し訳ありません。
 チェックボックス1〜8は下記の様になっています。

 チェックボックス1:製品No
 チェックボックス2:ランクA出荷出来ない
 チェックボックス3:ランクB出荷出来ない
    ・          ・
    ・          ・
    ・          ・
    ・          ・
 チェックボックス7:ランクF出荷出来ない
 チェックボックス8:予備(ランクが増えた時用の為現時点では使用しません)

 AAA.xlsm には【出荷した製品の数量】を転記しており、CCC.xlsm には【出荷出来ない製品の数量】を
 転記したいと思っています。CCC.xlsmに転記された数量は出荷できないのでI列の保管場所が必要になっています。

 分かりにくければご指摘お願い致します。
 
(ちぃちゃん) 2015/05/08(金) 22:39

 説明ありがとう。頭がスッキリしました。(と、思います)
 以下を試して、βの誤解があれば指摘願います。

 Private Sub UserForm_Initialize()
    CheckBox1.Value = True
 End Sub

 Private Sub CheckBox1_Click()
    Dim i As Long

    'CheckBox1が選択   -->CheckBox2〜8 を未選択、かつ選択不可
    'CheckBox1が未選択 -->CheckBox2〜8 を選択可
    For i = 2 To 8
        Controls("CheckBox" & i).Enabled = Not CheckBox1.Value
        If CheckBox1.Value Then Controls("CheckBox" & i).Value = False
    Next

 End Sub

 Private Sub CommandButton1_Click()
    Dim i As Long
    Dim d As String

    If TextBox1.Value = "" Then
        MsgBox "バーコードが未入力です"
        TextBox1.SetFocus
        Exit Sub
    End If

    For i = 2 To 8
        d = Controls("TextBox" & i).Value
        If Len(d) > 0 And Not IsNumeric(d) Then
            MsgBox "数値での入力が必要です"
            Controls("TextBox" & i).SetFocus
            Exit Sub
        End If
    Next

    If Len(TextBox8.Value) > 0 And Len(TextBox9.Value) = 0 Then
        MsgBox "ランク外入力時は保管場所入力が必須です"
        TextBox9.SetFocus
        Exit Sub
    End If

    With Workbooks("AAA.xlsm").Sheets("Sheet1")     '★シート名は実際のものに
        With .Range("A" & Rows.Count).End(xlUp).Offset(1)
            '処理-A 出荷した情報
            UpdateAC .Cells, False
        End With
    End With

    With Workbooks("CCC.xlsm").Sheets("Sheet1")     '★シート名は実際のものに
        With .Range("A" & Rows.Count).End(xlUp).Offset(1)
            '処理-C 出荷できない情報
            UpdateAC .Cells, True
        End With
    End With

    '登録後、TextBoxの値をクリア
    For i = 1 To 9
        Controls("TextBox" & i).Value = ""
    Next

 End Sub

 Private Sub UpdateAC(Pos As Range, CkFlag As Boolean)
    Dim i As Long
    With Pos.EntireRow
        .Range("A1").Value = TextBox1.Value 'バーコード
        'TextBox2〜8 --> B〜H列へ
        For i = 2 To 8
            If Controls("CheckBox" & i).Value = CkFlag Then .Cells(i).Value = Controls("TextBox" & i).Value
        Next
        If .Range("H1").Value <> 0 Then .Range("I1").Value = TextBox9.Value '保管場所
    End With
 End Sub

(β) 2015/05/09(土) 06:51


 新規登録を意識したコードですが、もし、既存データの更新処理等もあるなら、そこでも使えるように
 UpdateAC は 以下がいいかも。

 Private Sub UpdateAC(Pos As Range, CkFlag As Boolean)
    Dim i As Long
    With Pos.EntireRow
        .Range("A1").Value = TextBox1.Value 'バーコード
        'TextBox2〜8 --> B〜H列へ
        For i = 2 To 8
            If Controls("CheckBox" & i).Value = CkFlag Then
                .Cells(i).Value = Controls("TextBox" & i).Value
            Else
                .Cells(i).clearontents
            End If
        Next
        If .Range("H1").Value <> 0 Then .Range("I1").Value = TextBox9.Value '保管場所
    End With
 End Sub

(β) 2015/05/09(土) 07:01


 β様 こんにちは。
 早速ありがとうございます。

 BBB.xlsm と DDD.xlsm の処理を残したままだと色んなエラーが出て対応出来なかったので、
 今回はAAA.xlsm と CCC.xlsmのみを処理してもらえる様に、BBB.xlsm と DDD.xlsmのコードは
 削除して上記コードを試させて頂きました。

 結果、AAA.xlsm は希望通りの処理が出来ましたが、CCC.xlsm が希望通りの処理になりませんでした。

 23〜26行目は、チェックボックス1にチェックを入れて転記した状態です。(転記×4回)
 27〜29行目は、チェックボックス2・3・4にチェックを入れて転記した状態です。(転記×1回)

 【希望した結果】
     |[A]       |[B]    |[C]    |[D]    |[E]    |[F]    |[G]    |[H]     |     
 [22]|バーコード|ランクA|ランクB|ランクC|ランクD|ランクE|ランクF|ランク外|
 [23]|1265895478|       |       |       |       |       |       |      88|        
 [24]|1452369874|       |       |       |       |       |       |      56|        
 [25]|1256325898|       |       |       |       |       |       |      64|        
 [26]|1254789632|       |       |       |       |       |       |      69|        
 [27]|1111111111|    213|       |       |       |       |       |        |     
 [28]|1111111111|       |    154|       |       |       |       |        |     
 [29]|1111111111|       |       |    229|       |       |       |        |     

 【今回返ってきた結果】
     |[A]       |[B]    |[C]    |[D]    |[E]    |[F]    |[G]    |[H]     
 [22]|バーコード|ランクA|ランクB|ランクC|ランクD|ランクE|ランクF|ランク外
 [23]|1265895478|       |       |       |       |       |       |      88
 [24]|1452369874|       |       |       |       |       |       |      56
 [25]|1256325898|       |       |       |       |       |       |      64
 [26]|1254789632|       |       |       |       |       |       |      69
 [27]|1111111111|    213|    154|    229|       |       |       |        
 [28]|          |       |       |       |       |       |       |        
 [29]|          |       |       |       |       |       |       |        

 今回色々試してみて、私の説明不足でキチンと伝わっていない部分があったので、追加で
 補足説明させて頂きます。

 1.テキストボックス1〜8までは必ず入力されますが、テキストボックス9は入力されない事もあります。
 現在のコードは、テキストボックス9が入力されないと"ランク外入力時は保管場所入力が必須です"の
 メッセージが出る様にして頂いていますが、テキストボックス9は入力されない事があるので下記の様に
 変更したのですが、間違い(考えられる不具合等)があればご指摘お願いします。

 If Len(TextBox8.Value) > 0 And Len(TextBox9.Value) = 0 Then
      ↓
 If Len(TextBox8.Value) = 0

 2.出来るならこうなればいいなぁというのがあるのですが、出来ればこちらもお願いしたいです。
 チェックボックス8を予備の位置づけからランク外に対応させ、チェックボックス1のチェックが
 外れたら、チェックボックス8にチェックが入る様にして、チェックボックス2〜7にもチェックを
 入れる事が出来る様にしたいです。
 (チェックボックス8のランク外は、常にAAA.xlsm / CCC.xlsm に転記が必要な為です。)

 【そうした場合の希望する結果】

 23〜26行目は、チェックボックス1にチェックを入れて転記した状態です。(転記×4回)
 27〜30行目は、チェックボックス2・3・4・8にチェックを入れて転記した状態です。(転記×1回)
 (チェックボックス8はチェックボックス1のチェックが外れた時点で自動的にチェック)

     |[A]       |[B]    |[C]    |[D]    |[E]    |[F]    |[G]    |[H]     
 [22]|バーコード|ランクA|ランクB|ランクC|ランクD|ランクE|ランクF|ランク外
 [23]|1265895478|       |       |       |       |       |       |      88
 [24]|1452369874|       |       |       |       |       |       |      56
 [25]|1256325898|       |       |       |       |       |       |      64
 [26]|1254789632|       |       |       |       |       |       |      69
 [27]|1111111111|    213|       |       |       |       |       |        
 [28]|1111111111|       |    154|       |       |       |       |        
 [29]|1111111111|       |       |    229|       |       |       |        
 [30]|1111111111|       |       |       |       |       |       |     125

 次に、(ちぃちゃん) 2015/05/08(金) 22:39で記載していたチェックボックス1の説明が
 間違っていたので訂正させて頂きます。

 チェックボックス1:製品No・・・・・誤
 チェックボックス1:全ランク出荷・・正

 今回も長々と書いてしまいましたが説明不足等ありましたらご指摘お願い致します。

 以上宜しくお願い致します。

(ちぃちゃん) 2015/05/09(土) 12:04


 ランク外数量(TextBox8) が入力されている場合は、それが AAA.xlsm あるいは CCC.xlsm のいずれかに
 反映されるので、保管場所の入力を必須にしています。以下の改訂版でも、そこは変えていません。
 βの勝手な想像で、AAA.xlsm にも I列(保管場所)が存在すると思っていて、だから AAA.xlsm に対しても ランク外数量があればI列の保管場所を転記しています。

 もし、AAA.xlsm にはI列保管場所がなく、ランク外数量が転記されるのが CCC.xlsm ではなく AAA.xlsm の場合は
 保管場所チェックをしない ということなら、そのように対応しますが以下は、とにかくランク外入力あれば保管場所必須のままです。

 CommandButton1_Click と UpdateAC を置き換えてください。

 Private Sub CommandButton1_Click()
    Dim i As Long
    Dim d As String

    If TextBox1.Value = "" Then
        MsgBox "バーコードが未入力です"
        TextBox1.SetFocus
        Exit Sub
    End If

    For i = 2 To 8
        d = Controls("TextBox" & i).Value
        If Len(d) > 0 And Not IsNumeric(d) Then
            MsgBox "数値での入力が必要です"
            Controls("TextBox" & i).SetFocus
            Exit Sub
        End If
    Next

    If Len(TextBox8.Value) > 0 And Len(TextBox9.Value) = 0 Then
        MsgBox "ランク外入力時は保管場所入力が必須です"
        TextBox9.SetFocus
        Exit Sub
    End If

    With Workbooks("AAA.xlsm").Sheets("Sheet1")     '★シート名は実際のものに
        With .Range("A" & Rows.Count).End(xlUp).Offset(1)
            '処理-A 出荷した情報
            UpdateAC .Cells, False
        End With
    End With

    With Workbooks("CCC.xlsm").Sheets("Sheet1")     '★シート名は実際のものに
        With .Range("A" & Rows.Count).End(xlUp).Offset(1)
            '処理-C 出荷できない情報
            UpdateAC .Cells, True, True
        End With
    End With

    '登録後、TextBoxの値をクリア
    For i = 1 To 9
        Controls("TextBox" & i).Value = ""
    Next

 End Sub

 Private Sub UpdateAC(Pos As Range, CkFlag As Boolean, Optional MultiLine As Boolean = False)
    Dim i As Long
    Dim x As Long
    With Pos.EntireRow
        'TextBox2〜8 --> B〜H列へ
        For i = 2 To 8
            .Cells(i).Offset(x).ClearContents
            If Controls("CheckBox" & i).Value = CkFlag Then
                If Val(Controls("TextBox" & i).Value) <> 0 Then
                    .Range("A1").Offset(x).Value = TextBox1.Value 'バーコード
                    .Cells(i).Offset(x).Value = Controls("TextBox" & i).Value
                    If i = 8 And .Cells(8).Offset(x).Value <> 0 Then .Cells(9).Offset(x).Value = TextBox9.Value '保管場所
                    If MultiLine Then x = x + 1
                End If
            End If

        Next
    End With
 End Sub

(β) 2015/05/09(土) 13:51


 追伸で

 もし、保管場所の必須チェックそのものをはずすなら、

    If Len(TextBox8.Value) > 0 And Len(TextBox9.Value) = 0 Then
        MsgBox "ランク外入力時は保管場所入力が必須です"
        TextBox9.SetFocus
        Exit Sub
    End If

 これを、丸ごと、取り除けばOKです。

(β) 2015/05/09(土) 14:40


 もし、BBB.xlsm への更新条件が以前と同じなら CommandButton1_Click を以下のようにすればいいかも。

 Private Sub CommandButton1_Click()
    Dim i As Long
    Dim d As String
    Dim tot As Long
    Dim cnt As Long

    If TextBox1.Value = "" Then
        MsgBox "バーコードが未入力です"
        TextBox1.SetFocus
        Exit Sub
    End If

    For i = 2 To 8
        d = Controls("TextBox" & i).Value
        If Len(d) > 0 And Not IsNumeric(d) Then
            MsgBox "数値での入力が必要です"
            Controls("TextBox" & i).SetFocus
            Exit Sub
        End If
    Next

    If Len(TextBox8.Value) > 0 And Len(TextBox9.Value) = 0 Then
        MsgBox "ランク外入力時は保管場所入力が必須です"
        TextBox9.SetFocus
        Exit Sub
    End If

    With Workbooks("AAA.xlsm").Sheets("Sheet1")     '★シート名は実際のものに
        With .Range("A" & Rows.Count).End(xlUp).Offset(1)
            '処理-A 出荷した情報
            UpdateAC .Cells, False
            cnt = WorksheetFunction.Count(.EntireRow.Range("B1:I1"))
            tot = WorksheetFunction.Sum(.EntireRow.Range("B1:I1"))
        End With
    End With

    With Workbooks("BBB.xlsm").Sheets("Sheet1")     '★シート名は実際のものに
        If cnt > 0 Then
            With .Range("A" & Rows.Count).End(xlUp).Offset(1).EntireRow
                .Range("A1").Value = TextBox1.Value
                .Range("C1").Value = tot
                .Range("B1").Value = IIf(OptionButton1.Value, "済", "未")
            End With
        End If
    End With

    With Workbooks("CCC.xlsm").Sheets("Sheet1")     '★シート名は実際のものに
        With .Range("A" & Rows.Count).End(xlUp).Offset(1)
            '処理-C 出荷できない情報
            UpdateAC .Cells, True, True
        End With
    End With

    '登録後、TextBoxの値をクリア
    For i = 1 To 9
        Controls("TextBox" & i).Value = ""
    Next

 End Sub

(β) 2015/05/09(土) 18:06


 あっ、今わかりました。
 AAA.xlsm は【出荷した記録】なので、保管場所はいらないんですね。(レイアウトにもない)
 なので、BBB.xlsm で ランク外が対象になった時のみ、保管場所入力が必要ということですね。

 ちょっと、その部分に手を入れます。

    If Len(TextBox8.Value) > 0 And Len(TextBox9.Value) = 0 Then
        MsgBox "ランク外入力時は保管場所入力が必須です"
        TextBox9.SetFocus
        Exit Sub
    End If

 これを

    If CheckBox.Value And Len(TextBox8.Value) > 0 Then
        If Len(TextBox9.Value) = 0 Then
            MsgBox "ランク外入力時は保管場所入力が必須です"
            TextBox9.SetFocus
            Exit Sub
        End If
    End If

 でいかがですか?(18:58 ちょと訂正)

 で、追加で。

 AAA.xlsm には保管場所を転記しない対応。

 If i = 8 And .Cells(8).Offset(x).Value <> 0 Then .Cells(9).Offset(x).Value = TextBox9.Value '保管場所

 これを

 If CkFlag And i = 8 And .Cells(8).Offset(x).Value <> 0 Then .Cells(9).Offset(x).Value = TextBox9.Value '保管場所

 に変更。

(β) 2015/05/09(土) 18:10


 β様 こんばんは。
 提示して頂いたコードを試してみたところ、下記エラーが下記の場所で発生しました。

 実行時エラー'424':
 オブジェクトが必要です。

 If CheckBox.Value And Len(TextBox8.Value) > 0 Then

 現在のコードは下記です。

 Private Sub UserForm_Initialize()
    CheckBox1.Value = True
 End Sub

 Private Sub CheckBox1_Click()
    Dim i As Long

    'CheckBox1が選択   -->CheckBox2〜9 を未選択、かつ選択不可
    'CheckBox1が未選択 -->CheckBox2〜9 を選択可
    For i = 2 To 9

        Controls("CheckBox" & i).Enabled = Not CheckBox1.Value
        If CheckBox1.Value Then Controls("CheckBox" & i).Value = False
    Next

 End Sub

 Private Sub CommandButton1_Click()
    Dim i As Long
    Dim d As String

    If TextBox1.Value = "" Then
        MsgBox "バーコードが未入力です"
        TextBox1.SetFocus
        Exit Sub
    End If

    For i = 2 To 9
        d = Controls("TextBox" & i).Value
        If Len(d) > 0 And Not IsNumeric(d) Then
            MsgBox "数値での入力が必要です"
            Controls("TextBox" & i).SetFocus
            Exit Sub
        End If
    Next

    If CheckBox.Value And Len(TextBox8.Value) > 0 Then
        If Len(TextBox9.Value) = 0 Then
            MsgBox "ランク外入力時は保管場所入力が必須です"
            TextBox9.SetFocus
            Exit Sub
        End If
    End If

   'AAA処理
    With Workbooks(Format(Now(), "yymm") & "_AAA.xlsm").Sheets("Sheet1")     '★シート名は実際のものに
        With .Range("A" & Rows.Count).End(xlUp).Offset(1)
            '処理-A 出荷した情報
            UpdateAC .Cells, False
        End With
    End With

    'CCC処理
     With Workbooks(Format(Now(), "yymm") & "_CCC.xlsm").Sheets("Sheet1") '★シート名は実際のものに
        With .Range("A" & Rows.Count).End(xlUp).Offset(1)
            '処理-C 出荷できない情報
            UpdateAC .Cells, True, True
        End With
    End With

    '登録後、TextBoxの値をクリア
    For i = 1 To 9
        Controls("TextBox" & i).Value = ""
    Next

 End Sub

 Private Sub UpdateAC(Pos As Range, CkFlag As Boolean, Optional MultiLine As Boolean = False)
    Dim i As Long
    Dim x As Long
    With Pos.EntireRow
        'TextBox2〜8 --> B〜H列へ
        For i = 2 To 8
            .Cells(i).Offset(x).ClearContents
            If Controls("CheckBox" & i).Value = CkFlag Then
                If Val(Controls("TextBox" & i).Value) <> 0 Then
                    .Range("A1").Offset(x).Value = TextBox1.Value 'バーコード
                    .Cells(i).Offset(x).Value = Controls("TextBox" & i).Value
                     If CkFlag And i = 8 And .Cells(8).Offset(x).Value <> 0 Then .Cells(9).Offset(x).Value = TextBox9.Value '保管場所
                    If MultiLine Then x = x + 1
                End If
            End If

        Next
    End With
 End Sub

 後、保管場所の件ですが、ランク外が入力された際に保管するのではなく、
 ランクA〜ランクF(チェックボックス2〜7)にチェックが入った際に、
 CCC.xlsmのみに記載します。 
 (私自身混乱していて、連絡が遅くなり申し訳ありませんでした。)

 又、BBB.xlsm の処理は、AAA.xlsm と CCC.xlsm が問題なく転記出来る様になってから
 レイアウト等の変更をする可能性があるので、AAA.xlsm と CCC.xlsm が終わってから
 考えながら相談させて下さい。

 以上、宜しくお願い致します。

(ちぃちゃん) 2015/05/09(土) 20:38


 エラーについては、ごめんなさい。

 If CheckBox8.Value And Len(TextBox8.Value) > 0 Then

 です。(汗、汗)

 BBB.xlsm の件了解。

 保管場所の件、こちらでも頭の中を整理してみます。

(β) 2015/05/09(土) 20:57


 保管場所、頭の中を整理する材料として教えてください。

 保管場所は TextBox9 ですよね。もちろん、これはユーザーフォーム上には1か所しかない。
 で、(ちぃちゃん) 2015/04/30(木) 21:56 の CCC.xlsm の説明の中で

 [27]|1111111111|    213|       |       |       |       |       |        |A-1     
 [28]|1111111111|       |    154|       |       |       |       |        |B-1     
 [29]|1111111111|       |       |    229|       |       |       |        |C-1     
 [30]|1111111111|       |       |       |       |       |       |     125|        

 上記27〜30行目は、チェックボックス2・3・4・8にチェックを入れて転記した状態です。(転記×1回)

 このように説明がありました。

 これを、βとしては

 ユーザーフォームで更新ボタンが押されたら、該当チェックごとに1行ずつ、転記していくと受け取りました。
 で、そうならば、そう受け取った時に質問すべきだったんですが、TextBox9 は1つしかないのに
 なぜ、 A-1 B-1 C-1 といった異なる保管場所がセットできるのでしょうか?

 ということもあって(?)、いつのまにかβの頭の中で、1か所しかない保管場所はランク外のものだと
 そう、思いこんでしまったんですが、各ランクごとのデータだとして、この異なる保管場所は、どこから
 もってくればよろしいですか?

(β) 2015/05/09(土) 21:06


 β様 こんにちは。

 If CheckBox8.Value And Len(TextBox8.Value) > 0 Then に変更したところ、
 エラーの発生はなくなり、ほぼ希望通りに転記する事が出来ました。

 >保管場所は TextBox9 ですよね。
 いいえ。TextBox9はランク外(2)と思って頂いた方が分かりやすいかと思います。
 又、TextBox9に数値が入力されていてもいなくてもAAA.xlsm と CCC.xlsm には
 何も影響がありません。今後ご相談させて頂くBBB.xlsm の時のみ影響します。

 >ユーザーフォームで更新ボタンが押されたら、該当チェックごとに1行ずつ、転記していくと受け取りました。
 はい。その通りです。現在はその様に出来ています。

 >なぜ、 A-1 B-1 C-1 といった異なる保管場所がセットできるのでしょうか?
 A-1 B-1 C-1とは、(ランクAを置き場A-1へ)(ランクBを置き場B-1へ)(ランクCを置き場C-1へ)という意味で、
 現在は、I列の保管場所は手入力しています。
(ここは都度変更が入る可能性があるので手入力のままで良いと思っています。)

 後、色々試している内にキチンと伝えられていなかった事を2点気付きました。

 1.AAA.xlsm は【出荷する記録】なので、ランク外の数値は転記する必要が無かった為、

 Private Sub UpdateAC(Pos As Range, CkFlag As Boolean, Optional MultiLine As Boolean = False)の

 For i = 2 To 8 を For i = 2 To 7 に変更しました。

 2.CCC.xlsm は【出荷出来ないものの記録】なので、チェックボックスのどこにチェックが
  入っていても、テキストボックス8の数値はH列に転記する必要がありました。
 そこで、、、
・チェックボックス1(全ランク出荷)にチェックが入っていてもテキストボックス8(ランク外)の数値をH列に転記。
・チェックボックス1以外ににチェックが入っていたら、そのランクとテキストボックス8の数値をH列に転記。
・チェックボックス1のチェックが外れたら、自動的にチェックボックス8(ランク外)にチェックが入り、
  他のチェックボックスにもチェックが出来る様に出来ないでしょうか?

 色々わがままを言って申し訳ありませんが、出来る範囲で宜しくお願い致します。

(ちぃちゃん) 2015/05/10(日) 11:17


 まず、

 ・チェックボックス1のチェックが外れたら、自動的にチェックボックス8(ランク外)にチェックが入り、
  他のチェックボックスにもチェックが出来る様に出来ないでしょうか?

 これは、今そうなっていると思いますが?そうなってませんか?

 で、説明のあったことをもとに以下を盛り込んでコード修正に着手しますが、もし勘違いあれば
 連絡お願いします。

 ・保管場所はマクロ(ユーザーフォーム)では相手にせず、シート上の手入力で運用。
 ・TextBox9 は ランク外(2)用の数量欄
 ・AAA.xlsm にはランク外は転記せず(出荷対象外)
 ・当面ランク外(2) は運用しないということですが、入力があれば CCC.xlsmには反映させます。
 (数量入力がなければ反映させません。というか空白のまま転記。)

 ということは、ランク外、ランク外(2) は AAA.xlsm 対象外で、CCC.xlsm には必ず反映なので
 CHeckBox8 は不要なのでは?

(β) 2015/05/10(日) 12:15


 先走りかもしれませんが、改訂版をアップします。

 CheckBox8 は相手にしません。(存在しないものとして扱っています)
 TextBox9 はランク外(2) ということで、コードとしては入力があれば CCC.xlsm の I列に転記します。
 入力がなければ、転記しません。
 当面、この運用をしないのであれば、コードはこのままで、ユーザーフォームの TextBox9 のプロパティの
 Visible を False にしておけば、見えませんし、したがって入力できないので、I列に転記されることもありません。
 いずれ、ランク外(2)の運用開始になれば、このプロパティを True にしてやれば、コードはそのまま使えます。

 ということにしましたので、CheckBox1 のチェックが外れたときのCheckBox8 への自動チェックはなくしました。

 Private Sub UserForm_Initialize()
    CheckBox1.Value = True
 End Sub

 Private Sub CheckBox1_Click()
    Dim i As Long

    'CheckBox1が選択   -->CheckBox2〜7 を未選択、かつ選択不可
    'CheckBox1が未選択 -->CheckBox2〜7 を選択可
    For i = 2 To 7
        Controls("CheckBox" & i).Enabled = Not CheckBox1.Value
        If CheckBox1.Value Then Controls("CheckBox" & i).Value = False
    Next

 End Sub

 Private Sub CommandButton1_Click()
    Dim i As Long
    Dim d As String

    If TextBox1.Value = "" Then
        MsgBox "バーコードが未入力です"
        TextBox1.SetFocus
        Exit Sub
    End If

    For i = 2 To 9
        d = Controls("TextBox" & i).Value
        If Len(d) > 0 And Not IsNumeric(d) Then
            MsgBox "数値での入力が必要です"
            With Controls("TextBox" & i)
                .SelStart = 0
                .SelLength = .TextLength
                .SetFocus
                Exit Sub
            End With
        End If
    Next

    With Workbooks("AAA.xlsm").Sheets("Sheet1")     '★シート名は実際のものに
        With .Range("A" & Rows.Count).End(xlUp).Offset(1)
            '処理-A 出荷した情報
            UpdateAC .Cells, False
        End With
    End With

    With Workbooks("CCC.xlsm").Sheets("Sheet1")     '★シート名は実際のものに
        With .Range("A" & Rows.Count).End(xlUp).Offset(1)
            '処理-C 出荷できない情報
            UpdateAC .Cells, True
        End With
    End With

    '登録後、TextBoxの値をクリア
    For i = 1 To 9
        Controls("TextBox" & i).Value = ""
    Next

 End Sub

 Private Sub UpdateAC(Pos As Range, CkFlag As Boolean)
    Dim i As Long
    Dim x As Long
    With Pos.EntireRow
        'TextBox2〜7 --> B〜G列へ
        For i = 2 To 7
            .Cells(i).Offset(x).ClearContents
            If Controls("CheckBox" & i).Value = CkFlag Then
                If Val(Controls("TextBox" & i).Value) <> 0 Then
                    .Range("A1").Offset(x).Value = TextBox1.Value 'バーコード
                    .Cells(i).Offset(x).Value = Controls("TextBox" & i).Value
                    If CkFlag Then x = x + 1
                End If
            End If
        Next
        If CkFlag Then  '出荷停止分 出荷停止ブックへは入力あれば無条件反映
            If TextBox8.Value <> "" Then
                .Range("H1").Offset(x).Value = TextBox8.Value
                x = x + 1
            End If
            If TextBox9.Value <> "" Then .Range("G1").Offset(x).Value = TextBox9.Value
        End If
    End With
 End Sub

(β) 2015/05/10(日) 13:23


 ごめんなさい

 UpdateAC リバイスしてください。

 Private Sub UpdateAC(Pos As Range, CkFlag As Boolean)
    Dim i As Long
    Dim x As Long
    With Pos.EntireRow
        'TextBox2〜7 --> B〜G列へ
        For i = 2 To 7
            .Cells(i).Offset(x).ClearContents
            If Controls("CheckBox" & i).Value = CkFlag Then
                If Val(Controls("TextBox" & i).Value) <> 0 Then
                    .Range("A1").Offset(x).Value = TextBox1.Value 'バーコード
                    .Cells(i).Offset(x).Value = Controls("TextBox" & i).Value
                    If CkFlag Then x = x + 1
                End If
            End If
        Next
        If CkFlag Then  '出荷停止分 出荷停止ブックへは入力あれば無条件反映
            If TextBox8.Value <> "" Then
                .Range("A1").Offset(x).Value = TextBox1.Value 'バーコード
                .Range("H1").Offset(x).Value = TextBox8.Value
                x = x + 1
            End If
            If TextBox9.Value <> "" Then
                .Range("A1").Offset(x).Value = TextBox1.Value 'バーコード
                .Range("G1").Offset(x).Value = TextBox9.Value
            End If
        End If
    End With
 End Sub

(β) 2015/05/10(日) 14:24


 β様 こんばんは。
 いつもありがとうございます。

 私がお願いしていた事は全て出来ていました。

 >これは、今そうなっていると思いますが?そうなってませんか?
 なっていませんでした。私が何か伝え忘れていたか、ユーザーフォーム内で
 不具合があったのかもしれません。すいません。

 もう少し色々試してみて、私の勘違い等問題がなければBBB.xlsm のレイアウト等
 考えていきたいと思います。その時はまた相談に乗って下さい。

 宜しくお願い致します。

 ありがとうございました。

(ちぃちゃん) 2015/05/10(日) 21:03


 おはようございます。

 BBB.xlsm のレイアウトや「こうなってほしい」というのがまとまってきたので
 宜しくお願い致します。

 レイアウトは下記の様にしようと思っています。

     |[C]       |[D]  |[E]    |[F] |[G]             |[H]         |[I]     |[J]      
 [38]|バーコード|装置 |処理日 |報告|出荷出来ない枚数|ランク外集計|ランク外|ランク外2
 [39]|1234567890|1号機|5月25日|済  |                |          33|      33|         
 [40]|1111111111|2号機|5月25日|済  |                |         100|     150|       50
 [41]|2222222222|1号機|5月25日|済  |                |         142|     210|       68
 [42]|3333333333|3号機|5月25日|済  |                |          78|      78|         
 [43]|4444444444|2号機|5月25日|済  |                |          23|      23|         

 C列はテキストボックス1の値を転記。
 D列はオプションボタン5〜9で選択されたものを転記。
 (ボタン5:1号機 / ボタン6:2号機・・・・ボタン9:5号機)
 F列はオプションボタン1or2で選択されたものを転記。
 (ボタン1:済 / ボタン2:未)
 G列はチェックボックス2〜7で選択されたチェックボックスに対応した
 テキストボックスの値を合計したものを転記。
 I列はテキストボックス8の値を転記。
 J列はテキストボックス9の値を転記 という感じにしたいと思っています。
 (E列とH列は、BBB.xlsm側で対応してるので処理不要です。)

 テキストボックスとチェックボックスの関係は下記です。

 テキストボックス1 = チェックボックスなし
 テキストボックス2 = チェックボックス2
 テキストボックス3 = チェックボックス3
 テキストボックス4 = チェックボックス4
 テキストボックス5 = チェックボックス5
 テキストボックス6 = チェックボックス6
 テキストボックス7 = チェックボックス7
 テキストボックス8 = チェックボックスなし
 テキストボックス9 = チェックボックスなし

 今回も長々と書いてしまい、説明が分かりにくいかも知れませんが、
 宜しくお願い致します。

(ちぃちゃん) 2015/05/25(月) 09:27


 環境整備時間と思い出し時間、すこしください。
(β) 2015/05/25(月) 10:02

 1.CommandButton1 の CCC.xlms 処理の後あたりに以下を追加。

    With Workbooks("BBB.xlsm").Sheets("Sheet1")     '★シート名は実際のものに
        With .Range("C" & Rows.Count).End(xlUp).Offset(1)
            '処理-B 例外管理情報
            UpdateB .Cells
        End With
    End With

 2.新しいプロシジャとして以下を追加。

 Private Sub UpdateB(Pos As Range)
    Dim i As Long
    Dim ngQ As Long
    Dim pLine As Long

    For i = 2 To 7
        If Controls("CheckBox" & i).Value Then ngQ = ngQ + Controls("TextBox" & i).Value
    Next

    For i = 5 To 9
        If Controls("OptionButton" & i).Value Then
            pLine = i - 4
            Exit For
        End If
    Next

    With Pos.EntireRow
        .Range("C1").Value = TextBox1.Value                         'バーコード
        .Range("D1").Value = pLine & "号機"
        .Range("E1").Value = Date                                   '当日
        .Range("F1").Value = IIf(OptionButton1.Value, "済", "未")
        .Range("G1").Value = ngQ                                    '出荷不能数量
        .Range("I1").Value = TextBox8.Value                         'ランク外
        .Range("J1").Value = TextBox9.Value                         'ランク外2
        .Range("H1").Value = .Range("I1").Value + .Range("J1").Value

    End With

 End Sub
(β) 2015/05/25(月) 15:59

 β様 おはようございます。
 いつもありがとうございます。

 BBB.xlsm で上記提示頂いたコードを確認させて頂きましたところ
 私がお願いしていた事が完璧に出来ていました。

 ありがとうございました。

 最後に、DDD.xlsm もご教授お願い致します。
 DDD.xlsm のレイアウトは下記の様になっています。

     |[E]          |[F]     |[G] 
 [57]|バ-コ−ド入力|入力日付|出荷する枚数
 [58]|   1111111111|5月7日  |
 [59]|   2222222222|5月7日  |
 [60]|   3333333333|5月7日  |
 [61]|   4444444444|5月7日  |

 E列はテキストボックス1の値を転記。
 G列はチェックボックス2〜7で選択されなかったチェックボックスに
 対応したテキストボックスの値を合計したものを転記。
 (G列は出荷したいものの記録なので、BBB.xlsm の時とは逆の考えになります。)

 テキストボックスとチェックボックスの関係はBBB.xlsm の時と同じです。

 何度も申し訳ありませんが宜しくお願い致します。

(ちぃちゃん) 2015/05/26(火) 10:46


 それでは

 CommandButton1_Click に

    With Workbooks("DDD.xlsm").Sheets("Sheet1")     '★シート名は実際のものに
        With .Range("E" & Rows.Count).End(xlUp).Offset(1)
            '処理-D 出荷管理情報
            UpdateD .Cells
        End With
    End With

 を追加し、新しいプロシジャとして以下を新設。

 Private Sub UpdateD(Pos As Range)
    Dim i As Long
    Dim okQ As Long

    For i = 2 To 7
        If Not Controls("CheckBox" & i).Value Then okQ = okQ + Controls("TextBox" & i).Value
    Next

    With Pos.EntireRow
        .Range("E1").Value = TextBox1.Value                         'バーコード
        .Range("F1").Value = Date                                   '当日
        .Range("G1").Value = okQ                                    '出荷数量
    End With

 End Sub

 ★今から2日間ほど、他出します。その間、バグ対応等、できないと思いますのでよろしく。

(β) 2015/05/26(火) 11:37


 β様 こんばんは。
 いつもありがとうございます。

 DDD.xlsm も私が希望した通りに完璧な動作をしました。
 本当に感謝です。ありがとうございます。

 でも、ごめんなさい。
 謝らないといけない事があります。

 始めにお願いしていた AAA.xlsm と CCC.xlsm ですが、元々は希望通りに動作していたのですが、
 シートの保護をかけていなかった為に、会社の他の人にレイアウトを変更されてしまいました。
 現在はこういうプログラムを組んでもらい、レイアウトを変更する事によって正しく動作しないので
 元に戻してほしいとお願いしてみたのですが、今回だけはこれ(レイアウト変更後)で進めさせて
 ほしいと言われてしまいました。コードを少し変更したりしてみたもののやっぱり私には難しく。。。
 今後は、シートの保護をかけて変更できない様にしてもいいと言ってもらえたので、もう一度だけ、
 AAA.xlsm と CCC.xlsm のレイアウト変更後の状態で希望通りの動作をする様に教えて頂けないでしょうか。

 後、出来ればですが、AAA.xlsm と CCC.xlsm を、BBB.xlsm や DDD.xlsm の様に、ひとつづつ独立した状態
 でお願いしたいです。(独立した状態なら、もしかしたら、、、私でも、、、なんて甘い考えをもって・・・)

 レイアウト変更後の状態は下記です。

 【AAA.xlsm】

     |[E]        |[F]          |[G]    |[H]    |[I]    |[J]    |[K]    |[L]    |[M] 
 [3] |バ-コ−ド  |A + B      |ランクA|ランクB|ランクC|ランクD|ランクE|ランクF|日付
 [4] |予定枚数   |=SUM(G4:H4)  | 10,000|  8,000| 20,000| 20,000|  8,000|  5,000|    
 [5] |予定 - 累計|             |  9,500|  7,050| 19,000| 19,850|  7,850|  4,900|    
 [6] |累計       |             |    500|    950|  1,000|    150|    150|    100|    
 [7] | 1111111111|=SUM(G7:H7)  |    230|    420|    100|     50|     60|     10|    
 [8] | 2222222222|=SUM(G8:H8)  |    100|    110|    200|     30|     30|     30|    
 [9] | 3333333333|=SUM(G9:H9)  |     60|    260|    300|     40|     40|     50|    
 [10]| 4444444444|=SUM(G10:H10)|    110|    160|    400|     30|     20|     10|    
 [11]|           |             |       |       |       |       |       |       |    
 [12]|           |             |       |       |       |       |       |       |    

 ・C列とD列は結合されています。
 ・F列はSUM関数でランクAとランクBの合計を出しています。
 ・ランク外の転記は不要になりました。

 条件は前回と同じく下記です。

 1.チェックボックス1にチェックが入った時は、他のチェックボックスにチェックを
 入れると間違いなので、出来れば他のチェックボックスに チェック出来ない様に
 したいです。(普段は、チェックボックス1にチェックが入る事が殆どです。)

 2.チェックボックス1以外は、複数にチェックが入る可能性があるのでチェックが
 入った箇所は転記せずに、チェックが入っていない箇所のみ転記する様にしたいです。

 テキストボックスと列とチェックボックスとの関係は下記の様になっています。

 テキストボックス1 = E列 = チェックボックスなし
 テキストボックス2 = G列 = チェックボックス2
 テキストボックス3 = H列 = チェックボックス3
 テキストボックス4 = I列 = チェックボックス4
 テキストボックス5 = J列 = チェックボックス5
 テキストボックス6 = K列 = チェックボックス6
 テキストボックス7 = L列 = チェックボックス7

 わがままばかりで、本当に申し訳ありませんが、どうぞ宜しくお願い致します。

(ちぃちゃん) 2015/05/28(木) 22:49


 確認です。(とりあえず以下の理解で着手しますので、違っていれば指摘願います)

 ・レイアウト変更は AAA.xlsm のみで CCC.xlxm は従来通りですね?
 ・「C列とD列は結合されています。」レイアウトからは、ここがわからなかったので、とりあえず無視します。
 ・4行目は、あらかじめ利用者が数値をいれておくと考えます。
 ・5行目にはあらかじめ = G4 - G6 といった数式が入っているものとします。
 ・6行目はあらかじめ数式がはいっているのではなく、マクロで計算して値を埋め込むか、あるいはマクロで適切な数式を埋め込みます。
 ・F列の数式(7行目以降)は、マクロで追加行に対して数式を埋め込みます。

(β) 2015/05/29(金) 06:34


 とりあえず↑の理解で書きました。誤解していれば指摘願います。
 なお、BBB,DDD処理で、テキストボックスが空白の場合に不都合がでますので
 そこも直してあります。

 ・CommandButton1 ルーティンの AAA,CCC処理のところを

    With Workbooks("AAA.xlsm").Sheets("Sheet1")     '★シート名は実際のものに
        With .Range("E" & Rows.Count).End(xlUp).Offset(1)
            '処理-A 出荷した情報
            UpdateA .Cells
        End With
    End With

    With Workbooks("CCC.xlsm").Sheets("Sheet1")     '★シート名は実際のものに
        With .Range("A" & Rows.Count).End(xlUp).Offset(1)
            '処理-C 出荷できない情報
            UpdateC .Cells
        End With
    End With

 ・UpdateAC は廃止。

 ・UpdateB,UpdateDも含めて以下。

 Private Sub UpdateA(Pos As Range)
    Dim i As Long
    Dim z As Long

    z = Pos.Row

    With Pos.EntireRow
        'TextBox2〜7 --> G〜L列へ
        For i = 2 To 7
            .Cells(i + 5).ClearContents
            If Controls("CheckBox" & i).Value = False Then
                If Val(Controls("TextBox" & i).Value) <> 0 Then
                    .Range("E1").Value = TextBox1.Value 'バーコード
                    .Range("M1").Value = Date           '当日
                    .Cells(i + 5).Value = Controls("TextBox" & i).Value
                End If
            End If
        Next
        '数式埋め込み
        .Range("F1").Formula = "=SUM(G" & z & ":L" & z & ")"
        Pos.Parent.Range("G6:L6").Formula = "=SUM(G7:G" & z & ")"
    End With
 End Sub

 Private Sub UpdateC(Pos As Range)
    Dim i As Long
    Dim x As Long
    With Pos.EntireRow
        'TextBox2〜7 --> B〜G列へ
        For i = 2 To 7
            .Cells(i).Offset(x).ClearContents
            If Controls("CheckBox" & i).Value = True Then
                If Val(Controls("TextBox" & i).Value) <> 0 Then
                    .Range("A1").Offset(x).Value = TextBox1.Value 'バーコード
                    .Cells(i).Offset(x).Value = Controls("TextBox" & i).Value
                    x = x + 1
                End If
            End If
        Next
        If TextBox8.Value <> "" Then
            .Range("A1").Offset(x).Value = TextBox1.Value 'バーコード
            .Range("H1").Offset(x).Value = TextBox8.Value
            x = x + 1
        End If
        If TextBox9.Value <> "" Then
            .Range("A1").Offset(x).Value = TextBox1.Value 'バーコード
            .Range("G1").Offset(x).Value = TextBox9.Value
        End If
    End With
 End Sub

 Private Sub UpdateB(Pos As Range)
    Dim i As Long
    Dim ngQ As Long
    Dim pLine As Long

    For i = 2 To 7
        If Controls("CheckBox" & i).Value Then ngQ = ngQ + Val(Controls("TextBox" & i).Value)
    Next

    For i = 5 To 9
        If Controls("OptionButton" & i).Value Then
            pLine = i - 4
            Exit For
        End If
    Next

    With Pos.EntireRow
        .Range("C1").Value = TextBox1.Value                         'バーコード
        .Range("D1").Value = pLine & "号機"
        .Range("E1").Value = Date                                   '当日
        .Range("F1").Value = IIf(OptionButton1.Value, "済", "未")
        .Range("G1").Value = ngQ                                    '出荷不能数量
        .Range("I1").Value = TextBox8.Value                         'ランク外
        .Range("J1").Value = TextBox9.Value                         'ランク外2
        .Range("H1").Value = .Range("I1").Value + .Range("J1").Value

    End With

 End Sub

 Private Sub UpdateD(Pos As Range)
    Dim i As Long
    Dim okQ As Long

    For i = 2 To 7
        If Not Controls("CheckBox" & i).Value Then okQ = okQ + Val(Controls("TextBox" & i).Value)
    Next

    With Pos.EntireRow
        .Range("E1").Value = TextBox1.Value                         'バーコード
        .Range("F1").Value = Date                                   '当日
        .Range("G1").Value = okQ                                    '出荷数量
    End With

 End Sub

(β) 2015/05/29(金) 07:20


 β様 こんばんは。
 早速ありがとうございます。

 また私の説明不足でご迷惑をお掛けして申し訳ありません。
 ご確認頂いた内容に関しまして、お答えさせて頂きます。

 >・レイアウト変更は AAA.xlsm のみで CCC.xlxm は従来通りですね?
 すいません。・レイアウト変更は AAA.xlsm と CCC.xlxm の両方です。両方同時だと私自身が混乱しそうだったので、
 まずはAAA.xlsm のみを記載させて頂きました。AAA.xlsm の後でCCC.xlsmもお願いしたいです。 

 >・「C列とD列は結合されています。」レイアウトからは、ここがわからなかったので、とりあえず無視します。
 転記とは関係ない箇所なので、「結合されている」という事実だけをお伝えして、レアイウトに反映させるのを
 忘れていました。今後は注意します。

 >・4行目は、あらかじめ利用者が数値をいれておくと考えます。
 はい。その通りです。

 >・5行目にはあらかじめ = G4 - G6 といった数式が入っているものとします。
 はい。その通りです。

 >・6行目はあらかじめ数式がはいっているのではなく、マクロで計算して値を埋め込むか、あるいはマクロで適切な数式を埋め込みます。
 元々数式を入れていましたが、埋め込まれた数式で正しく計算されました。ありがとうございます。
 (レイアウトに数式を反映させるのを忘れていました。すいません。)

 >・F列の数式(7行目以降)は、マクロで追加行に対して数式を埋め込みます。
 ありがとうございます。

 説明不足にも関わらず、AAA.xlsm を希望通りに転記出来る様にして頂きありがとうございました。
 変更後のレイアウトを下記に書きますので、CCC.xlsm の方も宜しくお願い致します。

 【CCC.xlsm 】

 こちらも、チェックボックスのチェックの入り方によって転記方法が変わります。

 テキストボックスと列とチェックボックスとの関係は下記の様になっています。

 テキストボックス1 = C列 = チェックボックスなし
 テキストボックス2 = D列 = チェックボックス2
 テキストボックス3 = E列 = チェックボックス3
 テキストボックス4 = F列 = チェックボックス4
 テキストボックス5 = G列 = チェックボックス5
 テキストボックス6 = H列 = チェックボックス6
 テキストボックス7 = I列 = チェックボックス7
 テキストボックス8 = J列 = チェックボックス8

     |[A]|[B]|[C]          |[D]    |[E]    |[F]    |[G]    |[H]    |[I]    |[J]     |[K]     
 [3] |   |   |バ-コ−ド入力|ランクA|ランクB|ランクC|ランクD|ランクE|ランクF|ランク外|保管場所
 [4] |   |   |    123456789|       |       |       |       |       |       |      88|        
 [5] |   |   |    147852369|       |       |       |       |       |       |      56|        
 [6] |   |   |    987654321|       |       |       |       |       |       |      64|        
 [7] |   |   |    963258741|       |       |       |       |       |       |      69|        
 [8] |   |   |   1111111111|    213|       |       |       |       |       |        |        
 [9] |   |   |   1111111111|       |    154|       |       |       |       |        |        
 [10]|   |   |   1111111111|       |       |    229|       |       |       |        |        
 [11]|   |   |   1111111111|       |       |       |       |       |       |     125|        
 [12]|   |   |   2222222222|    365|       |       |       |       |       |        |        
 [13]|   |   |   2222222222|       |    254|       |       |       |       |        |        
 [14]|   |   |   2222222222|       |       |    511|       |       |       |        |        
 [15]|   |   |   2222222222|       |       |       |       |       |    114|        |        
 [16]|   |   |   2222222222|       |       |       |       |       |       |      56|        

 A列とB列は結合されています。

 上記4〜7行目は、チェックボックス1にチェックを入れて転記した状態です。(転記×4回)
 上記8〜11行目は、チェックボックス2・3・4にチェックを入れて転記した状態です。(転記×1回)
 上記12〜16行目は、チェックボックス2・3・4・7にチェックを入れて転記した状態です。(転記×1回)
 (I列の保管場所は手入力です)

 この様に、ランク別に保管場所が変わってくるので、チェックボックスに複数のチェックが
 入った時は、行をズラしていかないといけません。

 今回も説明不足でご迷惑をお掛けするかもしれませんが宜しくお願い致します。

(ちぃちゃん) 2015/05/30(土) 01:33


 今回は、誤解があるかも・・・と思ってます。

 >>テキストボックス8 = J列 = チェックボックス8

 とありますが、一方、

 >>上記4〜7行目は、チェックボックス1にチェックを入れて転記した状態です。(転記×4回)

 ここでランク外が転記されています。チェックボックス1にチェックですからチェックボックス8には
 チェックがはいっていないのでは?
 ということで、(以前もそうでしたが)ランク外が入力があれば、無条件転記します。

 チェックボックスの初期化に、いったんは CheckBox8 を追加したんですが、元に戻し 1〜7 を扱います。

 ComboBox1_Click の CCC.xlsm のところを

    With Workbooks("CCC.xlsm").Sheets("Sheet1")     '★シート名は実際のものに
        With .Range("C" & Rows.Count).End(xlUp).Offset(1)
            '処理-C 出荷できない情報
            UpdateC .Cells
        End With
    End With

 UpdateC を

 Private Sub UpdateC(Pos As Range)
    Dim i As Long
    Dim x As Long
    With Pos.EntireRow
        'TextBox2〜7 --> D〜I列へ
        For i = 2 To 7
            .Cells(i).Offset(x).ClearContents
            If Controls("CheckBox" & i).Value = True Then
                If Val(Controls("TextBox" & i).Value) <> 0 Then
                    .Range("C1").Offset(x).Value = TextBox1.Value 'バーコード
                    .Cells(i + 2).Offset(x).Value = Controls("TextBox" & i).Value
                    x = x + 1
                End If
            End If
        Next
        'ランク外あれば無条件に転記
        If TextBox8.Value <> "" Then
            .Range("C1").Offset(x).Value = TextBox1.Value 'バーコード
            .Range("J1").Offset(x).Value = TextBox8.Value
            x = x + 1
        End If
    End With
 End Sub

(β) 2015/05/30(土) 06:57


 β様 こんばんは。
 いつもありがとうございます。

 ご指摘頂いた件、β様の仰る通り間違っていました。
 正しくは下記でした。

 テキストボックス1 = C列 = チェックボックスなし
 テキストボックス2 = D列 = チェックボックス2
 テキストボックス3 = E列 = チェックボックス3
 テキストボックス4 = F列 = チェックボックス4
 テキストボックス5 = G列 = チェックボックス5
 テキストボックス6 = H列 = チェックボックス6
 テキストボックス7 = I列 = チェックボックス7
 テキストボックス8 = J列 = チェックボックスなし

 >ここでランク外が転記されています。チェックボックス1にチェックですからチェックボックス8には
 >チェックがはいっていないのでは?
 >ということで、(以前もそうでしたが)ランク外が入力があれば、無条件転記します。
 チェックボックス8自体が必要無かったので無くしたのにうっかりしていました。ごめんなさい。

 教えて頂いたコードに書き換えて転記してもらおうとした所、

 実行時エラー '1004':
 この操作は結合したセルには行えません。 のエラーが発生し、デバッグ(D)をクリックすると、

 .Cells(i).Offset(x).ClearContents の部分が黄色く反転していました。

 A列とB列が結合されているので、その部分で引っかかってる様ですが対応可能でしょうか?
 度々申し訳ありませんが、宜しくお願い致します。

(ちぃちゃん) 2015/05/31(日) 00:14


 >>A列とB列は結合されています。

 こうありましたけど

 >>A列とB列とC列は結合されています。

 だったんですかね?

 以下で。

    With Workbooks("CCC.xlsm").Sheets("Sheet1")     '★シート名は実際のものに
        With .Range("A" & Rows.Count).End(xlUp).Offset(1)
            '処理-C 出荷できない情報
            UpdateC .Cells
        End With
    End With

 Private Sub UpdateC(Pos As Range)
    Dim i As Long
    Dim x As Long
    With Pos.EntireRow
        'TextBox2〜7 --> D〜I列へ
        For i = 2 To 7
            .Cells(i + 2).Offset(x).ClearContents
            If Controls("CheckBox" & i).Value = True Then
                If Val(Controls("TextBox" & i).Value) <> 0 Then
                    .Range("A1").Offset(x).Value = TextBox1.Value 'バーコード
                    .Cells(i + 2).Offset(x).Value = Controls("TextBox" & i).Value
                    x = x + 1
                End If
            End If
        Next
        'ランク外あれば無条件に転記
        If TextBox8.Value <> "" Then
            .Range("A1").Offset(x).Value = TextBox1.Value 'バーコード
            .Range("J1").Offset(x).Value = TextBox8.Value
            x = x + 1
        End If
    End With
 End Sub

(β) 2015/05/31(日) 05:05


 あっ!! ごめんなさいかも。

 >>A列とB列は結合されています。

 これは正しかったんですね。

 では、(β) 2015/05/31(日) 05:05 のコードは無視し、(β) 2015/05/30(土) 06:57 のコードで

            .Cells(i).Offset(x).ClearContents

 これを

            .Cells(i + 2).Offset(x).ClearContents

 にしてください。

 実は、元々、このコードは不要だったんですが、将来、行追加だけではなく行変更がでてきたときに
 使えるかなと、なんとなく入れてあるコードです。
 同じようなところが UpdateA にもありますが、このコード自体をなくしてもOKです。

(β) 2015/05/31(日) 05:49


 β様 こんばんは。
 いつもありがとうございます。

 教えて頂いたところを修正して思い通りの結果を得る事が出来ました。
 ありがとうございます。

 これから色々試してみたいと思います。
 本当に長々とお付き合いありがとうございました。

 また助けて頂かないといけない時があるかもしれませんが、その時は宜しくお願い致します。

(ちぃちゃん) 2015/06/01(月) 00:06


コメント返信:

[ 一覧(最新更新順) ]


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