[[20121102115138]] 『入出庫の自動取り込み(5)』(初心者) ページの最後に飛ぶ

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

 

『入出庫の自動取り込み(5)』(初心者)

 ぶらっと様
 いつも本当にお世話になります。
 お陰様で、新しく教えていただいた在庫システム[[20121025090135]]も
 昨日から運用できています。

 現場からの要望でもう一つ、ご相談したい事項が出てきました。

 ご教授いただければ、幸いです。
 ご検討をお願いいたします。

 今回のご相談は、出庫指示書の作成についてです。
 上記、[[20121025090135]]で使っているシステムをそのまま使わせていただくことを
 前提として、ご相談させてください。

 現在、入出庫管理表のA列には、何も値も入れていません。
 空白のセルが、1行目から一番下のセルまでございます。

 例えば、アイテムのある行については、B列以降と同じように3行1セットにして、
 セルを統合します。(1アイテム目でいえば、A14:A16)
 入出庫管理表にあるアイテムについて、数字の「1」をいれたアイテムについては、
 デスクトップにおいてある「出庫指示書」というブックの「出荷指示書」という
 シートに自動で、「入出庫管理表のB列からK列までのデータ」を転記するように
 したいです。

出庫指示書のフォーマットはすでに別の指示書で使っているファイルを
名前だけ変更したいため、開始行、開始列は下記のようにしたいです。
印刷用の一枚には、20アイテムを格納します。

 1枚目    転記用アイテム開始行:19行目 終了行:38行目 開始列:C列
 2枚目  転記用アイテム開始行:49行目 終了行:68行目 開始列:C列
3枚目  転記用アイテム開始行:79行目 終了行:98行目 開始列:C列
 4枚目   転記用アイテム開始行:109行目 終了行:128行目 開始列:C列
 5枚目  転記用アイテム開始行:139行目 終了行:158行目 開始列:C列
 6枚目  転記用アイテム開始行:169行目 終了行:188行目 開始列:C列

 7枚目 転記用アイテム開始行:199行目 終了行:218行目 開始列:C列

 8枚目 転記用アイテム開始行:229行目 終了行:248行目 開始列:C列

 9枚目 転記用アイテム開始行:259行目 終了行:278行目 開始列:C列

 10枚目 転記用アイテム開始行:289行目 終了行:308行目 開始列:C列

テンプレート用の3行のA列について、セルの統合をしておけば、すべてのアイテムについてのA行も同様にセルの統合が行われると思いますが、以前まで教えていただいた
コードと今回のご相談させていただいている内容が抵触するかどうかも、分かりません。
(私にとっては、ご教授内容が、あまりに高度すぎます)

出来ましたら、上記の運用を実施したいのですが、運用面でもご教授いただければ
幸いです。

毎度、お手数をおかけしますが、ご確認をお願いいたします。

(初心者)

windows7
EXCEL2010


 ざっと読んだ感じでは、割合と簡単に対応できるような気がする。
 コードも今までのアクロバットのようなものじゃなく、ごくごく素直なものになりそう。

 確認

 たとえば入出庫管理表で 1 をつけたアイテムが3つだけだったとすると、出荷指示書は1枚だけ、3アイテムを転記して
 作成、もし 1 をつけたアイテムが 41個だったら、出荷指示書はフルに埋まった2枚と1アイテムだけの1枚、
 都合3枚ということでいいのかな?

 処理としては
 ・単に印刷して終わり?
 ・作成した出荷指示書シートをまとめたブックとして、どこかに保存?
 ・印刷したうえでどこかに保存?

 (ぶらっと)

ぶらっと様

さっそく、ご対応いただき、誠にありがとうございます。
たとえば入出庫管理表で 1 をつけたアイテムが3つだけだったとすると、出荷指示書は1枚だけ、3アイテムを転記して

 作成、もし 1 をつけたアイテムが 41個だったら、出荷指示書はフルに埋まった2枚と1アイテムだけの1枚、
 都合3枚ということでいいのかな?

⇒その通りです。

 処理としては
 ・単に印刷して終わり?
 ・作成した出荷指示書シートをまとめたブックとして、どこかに保存?
 ・印刷したうえでどこかに保存?

今回、教えていただきたいコードは、単に転記するというというところまでになるかと思います。

教えていただくコードで「出庫指示書」というマクロブックに転記します。
そのマクロブックには、原本として繰り返し使えるようにWORKBOOKに
下記のようなコードが書いています。

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim MyPath As String
Dim MyStr As String

    With Sheets("出荷指示書")
     MyPath = CreateObject("WScript.Shell").SpecialFolders("Desktop")
     Set myShell = Nothing

        MyPath = MyPath & "\出荷指示書\" & .Range("G10").Value & Format(.Range("F9").Value, "yyyymmdd") & .Range("I9").Value & .Range("J9").Value & ".xls"

        If Dir(MyPath) = "" Then
            If MsgBox("出荷指示書を保存しますか?", vbYesNo) = vbYes Then
                 If .Range("E14").Value = "" Then
                    MyStr = "先に名前を入力してください"
                Else
                     Sheets(Array("出荷指示書”)).Copy
                    ActiveWorkbook.SaveAs Filename:=MyPath
                End If
            End If
        Else
            MyStr = "現在未入力の部分があります!"
        End If
        If MyStr <> "" Then
            MyStr = MyStr & vbCrLf & vbCrLf & _
                "[OK....保存しない" & vbCrLf & _
                "[取り消し 編集に戻る"
            If MsgBox(MyStr, vbOKCancel) = vbCancel Then
                Cancel = True
            End If
        End If
        If Cancel = False Then
            Application.CellDragAndDrop = True
            ThisWorkbook.Saved = True
        End If
    End With
End Sub

また、印刷も、ページの先頭のアイテムが空欄であれば、印刷をしないように
下記のようなコードを書いています。

Sub 印刷()

   Dim z As Long
    Dim x As Long
    Dim i As Long

    If Len(Range("C19").Value) = 0 Then
        MsgBox "コードを入力してください"
        Exit Sub
     ElseIf Len(Range("E14").Value) = 0 Then
        MsgBox "登録名を入力してください"
        Exit Sub
    ElseIf Len(Range("J9").Value) = 0 Then
        MsgBox "データを入力してください"
        Exit Sub

    End If

    For i = 1 To 10
        z = (i - 1) * 30 + 19
        If Len(Cells(z, "C").Value) = 0 Then Exit For
        x = x + 1
    Next

    ActiveSheet.PrintOut From:=1, to:=x

End Sub

ですから、デスクトップ上の閉じているマクロブック「出庫指示書」をオープンにして、
入出庫管理表内のB列からK列までを転記していただければ、毎回日付のついた出庫指示書が
xlsファイルとして保存できることを想定しています。

お手数ですが、ご確認をお願いします。

(初心者)


 構成について、ちょっと疑問点。

 まず、出庫指示書ブックは、できればマクロブックではなくデータブックにしておく運用のほうがいいと思う。
 このあたりはアップしてもらったコードを熟読して、目的を再確認して、必須かどうか考えてみるね。

 それはそれとして、

 1.まず、出荷指示書シートなんだけど、これは1枚(1ページ)用だよね?
   で、かりに、今回3枚(3ページ)になったとすると、シートを3枚作るのかなと想定していたんだけど
   どうも、そちらの想定はシートは1枚だけ?1枚のシートに複数ページ分縦にずらっと続いているイメージ?
 2.印刷マクロはどこにかかれているの?出荷指示書ブック?
 3.コピーしてできあがる日別の出荷指示書コピーブックにはマクロはないけど、そういう認識?

 ↓ 以下の追加質問は、コードを読んで意図がわかったので「とりあえず」無視してね。

 追加で

 If Cancel = False Then

 これは、何をチェックしているの?

 (ぶらっと)

ぶらっと様

ありがとうございます。
下記ですが、
1.まず、出荷指示書シートなんだけど、これは1枚(1ページ)用だよね?
   で、かりに、今回3枚(3ページ)になったとすると、シートを3枚作るのかなと

 想定していたんだけど
 どうも、そちらの想定はシートは1枚だけ?1枚のシートに複数ページ分縦にずらっと
 続いているイメージ?
⇒その通りです。

2.印刷マクロはどこにかかれているの?出荷指示書ブック?
⇒以前作成した入荷実績表(出荷指示書の元ネタ)は、そのブックに書かれています。

3.コピーしてできあがる日別の出荷指示書コピーブックにはマクロはないけど、そういう認識?
その通りです。コピーして出来上がるブックは、ただの保存用です。

以上ですが、再度ご確認をお願いいたします。

(初心者)


 コードを読み、説明のあった転記要件とコードから、今回の出荷指示書のレイアウト全体と
 それをベースにした現場の運用の流れ、それをサポートするコードの意図について、なんとなく
 想像がついた。

 >以前作成した入荷実績表(出荷指示書の元ネタ)は、そのブックに書かれています。 

 この意味はよくわからないけど。。。今まで登場したのは
 入出庫管理表、出荷一覧表、出荷一覧表、情報変更表 だけじゃなかったっけ?
 Workbook_BeforeClose は今回の(雛形としての)出荷指示書ブックにかかれているんだろうけど、
 "印刷"マクロは、どこに書かれているのかなぁ・・・

 で、何も考えずに、今回の要件に従って淡々と転記するコードを書いてもいいんだけど、
 想像する運用の流れを考えたとき、「おせっかい」かもしれないけど、構成について提案もしたい。

 なので、以下、現状の流れについて当方の「想像」をメモするので確認して欲しい。

 1.レイアウト
  説明をもらったもの以外も想像で。
  1)1行目〜8行目までは、出荷指示書の「カガミ」のような部分で、おそらくは、この部分が
    ページ設定で印刷タイトル行にしてある?
  2)9〜38、39〜68、・・・・が実際の各ページの中味。それぞれのページの間には
    改ページが設定されている?
  3)9〜18には、F9、I9、J9、G10、E13 といった入力セルがあって、
    担当者が入力?
  4)2ページ目の該当のセルにも、それぞれの項目欄があって、そこには1ページ目の入力内容を
    参照する式がはいっている? それとも、ページ毎に、これらも入力?
  5)基本的には、出荷指示対象のアイテムを必要なだけ入力していくが、仮に前回のデータが
    アイテム数が多く、前回の操作で、雛型である出荷指示書ブック自体を保存していたような場合、
    今回の最終アイテムの次のアイテムのC列を空白にする?(これ以降はないという印)
  6)出荷指示書のアイテムの情報としてはC〜L列? 
    入出庫管理表で言えば、棚番から現在庫まで?
    通常出荷指示書というのは、いつ、何をいくつ出荷するというドキュメントだと思うんだけど?

 2.操作・運用等
  1)基本的には、出荷指示書に必要アイテムを入力し、印刷をして、そのシートを日付を名前に加えて別ブックとして保存。
  2)アイテム数が多い場合は、途中で雛形である出荷指示書のまま保存し、後でまた呼び出して、追加入力して作業するケースも。

 3.所感等
  1)エクセルで関数を活用してレイアウトをくむと、どうしても、アップされた例のように、たとえば10ページ分。
    20X10で200アイテムもあれば充分だろう、おつりがくる。 こうするのが宿命。
  2)だけど、VBAでやるのであれば、必要なページ数だけ(1ページなら1ページだけ、100ページなら100ページを)
    作成することができる。
 4.提案
  ということで、私がこのテーマのための仕組みを準備するなら
  1)まず、ユーザーフォームで出荷指示書の必要項目を入力するとともに、リストボックスに入出庫管理表のアイテムを
    表示して、そこで出荷指示書に反映すべきアイテムを任意に選ばせる。
  2)こうした上で、必要ページのみをもつ出荷指示書を作成。同時に印刷もできるし、後で、呼び出して印刷してもいい。
  3)何よりも、マクロはマクロブックである入出庫管理表に集約。
  4)出荷指示書は、純粋に「雛形」として位置づけ39行目(?)以降は削除。
 
 5.その他

   そちらの構想の入出庫一覧表のA列の結合は、これまでのロジックには全く影響しないので、そうした上で
   そこに抽出フラッグをいれて実行ということも、もちろんできるけど、4.で提案した形が運用上もシステム維持管理上も
   何かといいんじゃないかと思っている。

 (ぶらっと)

 こちらのリコメンドは上で書いたようなことだけど、とりあえず、そちらの要望だけを淡々と記述したコード。
 全体の配列内から当該ページ用の行分を抽出するコードは最近、seiyaさんに教えてもらった方法で記述。

 Sub 出荷指示書作成()
    Dim z As Long
    Dim x As Long
    Dim shM As Worksheet
    Dim v() As Variant
    Dim i As Long
    Dim j As Long
    Dim k As Long
    Dim myPath As String
    Dim shT As Worksheet

    Set shM = ThisWorkbook.Sheets(1)
    With shM
        i = 1
        z = .Range("M" & .Rows.Count).End(xlUp).Row - 3
        ReDim v(1 To 20 * 10, 1 To 10)

        For i = ItemStart To z Step 3
            If .Cells(i, "A").Value = 1 Then
                k = k + 1
                For j = 2 To 11 'B〜K
                    v(k, j - 1) = .Cells(i, j).Value
                Next
            End If
        Next
    End With

    If k = 0 Then
        MsgBox "出荷指示すべきアイテムが選択されていません"
        Exit Sub
    End If

    Application.ScreenUpdating = False

    myPath = CreateObject("WScript.Shell").SpecialFolders("DeskTop")
    Set shT = Workbooks.Open(myPath & "\出荷指示書.xls").Sheets(1)

    With shT
        'アイテム転記
        x = 1
        For i = 19 To 289 Step 30 '10ページ分
            .Cells(i, "C").Resize(20, 10).Value = Application.Index(v, Evaluate("row(" & x & ":" & x + 19 & ")"), Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))
            x = x + 20
        Next
    End With

    Application.ScreenUpdating = True
    MsgBox "出荷指示書の作成が終わりました"

 End Sub

 (ぶらっと)

ぶらっと様
おかげ様で、やりたいことが出来そうです。
本当にありがとうございます。

ご提案という形でいただいたご教授の部分については、
ユーザーフォームの基本的な部分を学んだ上で、
今後、改善していくときに再度ご相談に乗っていただければ幸いです。

よろしくお願いいたします。

なお、一点、追加でご相談したいのですが、
出荷指示書を発行するのは、一日でも、相当数あります。
出荷指示書のJ9のところにCodeとして、本日何回目の発行であるかを
数字で入力するところがあります。
ここに、できれば、本日の発行が何回目の発行であるかを自動采番という形で
飛ばしたいのですが、どのようにしたら良いでしょうか?

何度も何度も恐縮ですが、ご確認をよろしくお願いします。

(初心者)


 >出荷指示書のJ9のところにCodeとして、本日何回目の発行であるかを数字で入力するところがあります。 

 MyPath = MyPath & "\出荷指示書\" & .Range("G10").Value & Format(.Range("F9").Value, "yyyymmdd") & .Range("I9").Value & .Range("J9").Value & ".xls"

 この最後の J9 だね。ただ、J9 という場所は、入出庫管理表から転記する最初のアイテムの「前月末在庫」だと思うんだけど?
 また、採番の基準の日付は、「処理をした当日?」 とれとも、 F9に入力される「何かの日付?」

 自動採番の方法はいくつもあるけど、今回の場合、以下の2つあたりかな。自分としては 2.を推奨。

 1.採番管理シートを用意して、たとえばA列に基準日、B列にその基準日で採番した最後の番号をいれておく。
   FIndあるいはMatchで基準日を捜し、そこにある番号に +1 して反映するとともに、B列を変更して上書き保存。
   (もし、基準日がなければ、末尾に基準日を追加して 1 とする)
   2003でも65536行あるので、180-年ぐらいは使える。(実質的に、永久に使える)

 2.デスクトップフォルダの出荷指示書フォルダに格納されている出荷指示書ブック名で、同じ基準日を持つブックの番号で一番大きなもの + 1 にしてブックを作成。
   この場合、そういうことがしやすいようにブック名は
   "出荷指示書_○○○○■■■■△△△_基準日_番号.xls" といった形にしておいて ブック名を "_" で分解して 最後の2つを使う。

 どちらにするか決めてくれれば、そのためのコードをアップする。もし、2.の場合は、○○○○■■■■△△△ の部分をどう組み立てたいのかも
 教えてね。

 (ぶらっと)

ぶらっと様

早速、ありがとうございます。

 下記ですが、この最後の J9 だね。ただ、J9 という場所は、入出庫管理表から転記する最初のアイテムの「前月末在庫」だと思うんだけど?
→最初のアイテムは、19行目からです。

MyPath = MyPath & "\出荷指示書\" & .Range("G10").Value & Format(.Range("F9").Value, "yyyymmdd") & .Range("I9").Value & .Range("J9").Value & ".xls"

 また、採番の基準の日付は、「処理をした当日?」 とれとも、 F9に入力される「何かの日付?」
→上記G10には、出荷指示書が、F9には、今日の日付が入っています。
I9には、「-」が入っており、出来上がるときのコードは、「出荷指示書20121104-1」のようになります。

1.採番管理シートを用意して、たとえばA列に基準日、B列にその基準日で採番した最後の番号をいれておく。

   FIndあるいはMatchで基準日を捜し、そこにある番号に +1 して反映するとともに、B列を変更して上書き保存。
   (もし、基準日がなければ、末尾に基準日を追加して 1 とする)
   2003でも65536行あるので、180-年ぐらいは使える。(実質的に、永久に使える)

 2.デスクトップフォルダの出荷指示書フォルダに格納されている出荷指示書ブック名で、基準日を持つブックの番号で一番大きなもの + 1 にしてブックを作成。
   この場合、そういうことがしやすいようにブック名は
   "出荷指示書_○○○○■■■■△△△_基準日_番号.xls" といった形にしておいて ブック名を "_" で分解して 最後の2つを使う。

 どちらにするか決めてくれれば、そのためのコードをアップする。もし、2.の場合は、○○○○■■■■△△△ の部分をどう組み立てたいのかも
 教えてね。

→すみません。
上記内容が高度すぎて、どちらにしたら良いのか分かりません。
内容的には、、「出荷指示書20121104-1」という風になればよいのですが、
如何でしょうか?

どちらが、良いかご教授をよろしくお願いします。

(初心者)


 >最初のアイテムは、19行目からです。

 ああ、そうだったね。ごめん。

 >出来上がるときのコードは、「出荷指示書20121104-1」のようになります

 ということは、G10 には "出荷指示書" というコンスタント値が、I9 には "-" というコンスタント値が入っているということだね。
 で、この2つのセルの値は絶対に変更しないということなんだろうけど、プログラムとしては
 もし、変更されていれば、異なるブック名体系になってしまうということになるので、ここは

 MyPath = MyPath & "\出荷指示書\" & "出荷指示書" & Format(.Range("F9").Value, "yyyymmdd") & "-" & .Range("J9").Value & ".xls" 

 にしておくべきだね。(最後のJ9も今回手当をすることで変数になるんだけど)

 1.2.どちらでもいいのなら運用管理面で2.がベターなので、後ほど、2.用のコードをアップするね。

 追伸で

 If Dir(MyPath) = "" Then

 これで、必須項目のチェック?
 これは、今から作ろうとしているブックが存在しないので作ってもいいということだけど?

 なので、 下のほうの Else で表示すべきメッセージは、同じブックがあるよ! ということになる。
 まぁ、これも、今回の手当で必要なくなるけど。
 やるなら、必須項目が空白かどうかのチェックをしなきゃいけないよ。印刷でやっているように。

 (ぶらっと)


 それでは

 現在のコードから、

 MyPath = CreateObject("WScript.Shell").SpecialFolders("Desktop")
 と
 MyPath = MyPath & "\出荷指示書\" & .Range("G10").Value & Format(.Range("F9").Value, "yyyymmdd") & .Range("I9").Value & .Range("J9").Value & ".xls"

 を削除。(ついでに、Set myShell = Nothing これも意味がないと思うので削除)

 かわりに

 myPAth = getFullPath(.Range("F9").Value)  あるいは 絶対に処理する当日でいいなら myPAth = getFullPath(Date) でもいい。

 で、以下のファンクションプロシジャを追加。

 Function getFullPath(dt As Date) As String
    Const myPre As String = "出荷指示書"
    Dim n As Long
    Dim fName As String
    Dim w As Variant
    Dim strDt As String
    Dim myPAth As String

    strDt = Format(dt, "yyyymmdd")
    myPAth = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\出荷指示書\"

    fName = Dir(myPAth & myPre & strDt & "*.xls")

    Do While fName <> ""
        w = Split(fName, "-")
        If UBound(w) = 1 Then
            If n < Val(w(1)) Then n = Val(w(1))
        End If
        fName = Dir()
    Loop

    n = n + 1

    getFullPath = myPAth & myPre & strDt & "-" & n & ".xls"

 End Function

 (ぶらっと)

 現在のそちらの構成に合わせて、出荷指示書側の Workbook_BeforeClose で、保存ブック名連番を
 自動採番するようなコードをアップしたけど、全体の処理の流れをレビューしてみると、いささか
 うまくないなぁ・・・と。

 まず、保存する、しないにかかわらず、できあがった書類としての出荷指示書には J9 に、その連番が
 セットされていることが必要だね。(当たり前だけど)
 アップしたコードは、保存時にブック名を組み立てているだけなので、書類としての J9 には(少なくともコードでは)
 なにもセットしていない。ここは、自動採番した番号が、あらかじめ記載されているべきだねぇ。

 ということを考えると、出荷指示書に反映するアイテム選択は入出庫管理表のA列のマークによるとして
 入出庫管理表に新設した出荷指示書プロシジャで、この連番をあらかじめセットしたうえで、デスクトップ上の
 "出荷指示書フォルダ"に、自動生成したブック名で保存してしまう。この構えにしなければいけないのでは?

 で、必要なら、この時に必須チェックを行ったり、あるいは、ほんとに保存するのか、保存なしで破棄するのか
 そのあたりも制御。
 出荷指示書ひな形ブックからは、一切のマクロを削除。普通のブックにしておく。

 ついでにいえば、(しつこいかもしれないけど)出荷指示書日ひな形を1枚分だけの内容にしておいて
 入出荷指示書作成では、必要枚数の出荷指示書yyyymmdd-nn.xls を作るようにすれば、
 そちらが用意した "印刷"マクロ。これは、まったく必要がなくなる。(単純に、ブックを呼び出して印刷すればいい)

 こちらの意図が伝わるかどうか心配だけど、少なくとも 出荷指示書作成 で J9 に値をセットし、
 出荷指示書yyyymmdd-nn.xls を保存してしまうということは、【必須】だと思うので、後程、改訂したコードは
 アップしておく予定。

 (ぶらっと)

 例によって、いろいろコメントしたけど、もし、そちらが、現在準備している構成を、基本、さわりたくないということなら
 ↑で連絡した Workbook_BeforeClose 関連の改訂は、(書かれているロジックそのものは気になるところは多いけど)いったん無視して
 getFullPathプロシジャも、やめて、 あらためて、ThisWorkbookモジュールに以下を追加。
 ひな形ブックを呼び出したときに、J9に連番をセットしておくので、後は、既存の Workbook_BeforeClose で、J9を使ったブック名保存に
 つなげればいい。

 Private Sub Workbook_Open()
    With Sheets("出荷指示書")
        .Range("F9").Value = Date
        .Range("J9").Value = get連番(Date)
    End With
 End Sub

 Function get連番(dt As Date) As Long
    Const myPre As String = "出荷指示書"
    Dim n As Long
    Dim fName As String
    Dim w As Variant
    Dim strDt As String
    Dim myPAth As String

    strDt = Format(dt, "yyyymmdd")
    myPAth = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\出荷指示書\"

    fName = Dir(myPAth & myPre & strDt & "*.xls")

    Do While fName <> ""
        w = Split(fName, "-")
        If UBound(w) = 1 Then
            If n < Val(w(1)) Then n = Val(w(1))
        End If
        fName = Dir()
    Loop

    get連番 = n + 1

 End Function

 (ぶらっと)

ぶらっと様

ありがとうございます。
未だ、ご教授いただいたコードを試せていないのですが、
上記をなるべく早く確認させていただきます。

別の件ですが、13行目の非表示行が、部品をソートして解除すると
必ず出てきてしまいます。
ソートの設定は、B列からK列まで(9行目から13行目)です。
現場の人が使うと誤って削除してしまわないか不安です。

例えば、ソートをして解除することを条件として、13行目を再非表示にするような
マクロはありませんでしょうか?

入出庫作業をしても、たまに13行目が出てくることがありますので、
なるべく13行目を出さないような感じにしたいです。

お手数ですが、ご教授いただけたら幸いです。
よろしくお願いします。

(初心者)


 ソート?
 入出庫管理表のことだね?
 その9行目から13行目をなぜソートするの?

 >入出庫作業をしても、たまに13行目が出てくることがありますので

 具体的に、どういう作業をしたときにでてくるの?

 (ぶらっと)

ぶらっと様

9行目から12行目は、b列からK列までそれぞれセルの統合をして、
表題としていますが、13行目までを含めないと
空欄があるので、14行目からのアイテムがソートで選べないです。
具体的に必ず、再表示されるのは、ソートしてアイテムを選び、その後、抽出を全部にした後です。

(初心者)


 これは手作業じゃなく、どこかのコードに組み込んでいるのかな?(事前準備の後とか)
 で、9〜テンプレート行の上のアイテムの最後の行までをソート?

 ・後学のために教えて欲しいんだけど、もし、この領域なら、【同じサイズの結合セルが必要】ってでない?
  それを、どのようにして実行してるのかな?
 ・もし、コードでやっているなら、その部分のコードを教えて欲しい。
 ・ソートの必要性はこちらも感じていたんだけど、タイトル行からではなく、14行目のアイテムから
  最終アイテムまでを、先頭がデータ(VBAなら Header:=xlNo)でやればいかが?

 ただ、そういうこととは別に、仮にセル結合のない通常のリストで、1行目がタイトル行、2行目が非表示の空白行、3行目からデータ。
 こういったものをソートかけると、非表示行は(2010では)動かないけどねぇ。表示されることもない。

 ↑ 今、2003でも確認。2012/11/6 6:25

 もちろん、2行目が表示行なら空白なので、リストの一番下においやられるけどね。

 (ぶらっと)

ぶらっと様

アップが遅くなり、申し訳ありません。
これは手作業じゃなく、どこかのコードに組み込んでいるのかな?(事前準備の後とか)

 で、9〜テンプレート行の上のアイテムの最後の行までをソート?
⇒コードで組み込んでいません。
また、説明が悪かったと思いますが、
B列からK列までは、9行目か12行目をそれぞれセル結合してます。
例えばB列であれば、B9:B12として、表題として棚番と入れています。
そのまま、9行目から12行目を行でセレクトして、データソート設定を行ったところ、
(非表示の13行目が影響してか?)下のアイテムを選択できませんでした。

そこで、いったん13行目の非表示を解除して、9行目から13行目をセレクトして、
データソート設定を行ったところ上手くいきました。

セレクトした範囲は、B9:K13です。

特に、【同じサイズの結合セルが必要】という表示は出ませんでした。

 ・ソートの必要性はこちらも感じていたんだけど、タイトル行からではなく、14行目のアイテムから
  最終アイテムまでを、先頭がデータ(VBAなら Header:=xlNo)でやればいかが?
⇒そのようにやりたいのですが、方法が分かりません。
ご教授いただければ、幸いです。

また、話が広がって恐縮ですが、昨日、現場の人たちとシステムについて、
話をしていて、B列の棚位置順にしたがって、アイテムを並べ替えるようなボタン(マクロのこと)が
あれば、良いといわれました。
アイテムごとなので、3行まとめてですが、一気に並べ替えるようなことは、出来ますでしょうか?

具体的には、B列の棚位置とE列の部品番号について、期中に一気に並べ替える必要があります。

以上、ご確認をお願いいたします。

(初心者)


 入出庫管理表全体を並び替えるのは通常の並び替え作業では無理。
 理由は、K列までは結合セル、L列以降は通常セルだから。

 入出庫管理表を棚番、部品番号順にしたい場合、方法は2つ。

 1.コメントしたけど、入出庫更新プロシジャの中で Call 事前準備(shM, shF)
   ここでB〜K列までのスケルトン(枠)を作成している。この時点ではL列以降が空白になっている。
     このコードの下に 
   
   Call アイテムの並び替え

   これを記述。別途以下のプロシジャを追加。
   こうしておけば、並び替えられた後にデータが取り込まれるので、結果的に棚番、部品番号順の入出庫管理表ができあがる。

 Sub アイテムの並び替え()
    Dim shM As Worksheet
    Dim z As Long

    Set shM = ThisWorkbook.Sheets(1)
    With shM
       z = .Range("M" & .Rows.Count).End(xlUp).Row - 3

       .Range("B" & ItemStart & ":K" & z).Sort Key1:=.Columns("B"), Order1:=xlAscending, _
                                                Key2:=.Columns("E"), Order2:=xlAscending, _
                                                Header:=xlNo
    End With

 End Sub

 2.BからARまで、出来上がった形のものを並び替えるとすれば、ゴリゴリ、自前のコードを書く。
   どうしても必要なら、老骨にムチ打って(?)書いてもいいけど、1.で充分に目的は達成できるのではないかな?

 (ぶらっと)

 ↑でいったように、まったく必要はないと思うけど、老骨にムチ打って。(というほどのものではなかったけど)
 ●ただし、L列以降には、計算式はなく、値のみが存在するという前提。

 Sub アイテム列全体の並び替え()
    Dim shM As Worksheet
    Dim z As Long
    Dim i As Long
    Dim dicV As Object
    Dim vKey As String

    Set dicV = CreateObject("Scripting.Dictionary")

    Set shM = ThisWorkbook.Sheets(1)
    With shM
        z = .Range("M" & .Rows.Count).End(xlUp).Row - 3
        For i = ItemStart To z Step 3
            vKey = getKeyM(shM, i)
            dicV(vKey) = .Range("L" & i & ":AR" & i + 2).Value
        Next

       .Range("B" & ItemStart & ":K" & z).Sort Key1:=.Columns("B"), Order1:=xlAscending, _
                                                Key2:=.Columns("E"), Order2:=xlAscending, _
                                                Header:=xlNo
        For i = ItemStart To z Step 3
            vKey = getKeyM(shM, i)
            .Range("L" & i & ":AR" & i + 2).Value = dicV(vKey)
        Next

    End With
 End Sub

 (ぶらっと)

ぶらっと様

色々と本当にありがとうございます。
ご教授の通り、上記コードでうまくいくと思います。
少しお時間をいただき、確認させていただき、
問題があれば、再度ご相談させていただきます。

お礼が遅くなり、申し訳ありません。

(初心者)


コメント返信:

[ 一覧(最新更新順) ]


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