ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Excel(エクセル)活用コミュのマクロでの選別

  • mixiチェック
  • このエントリーをはてなブックマークに追加
教えて下さい。

写真のように、『User Form1』の行き先種別の項目から『盤』『機器』『器具etc』の三種類を選択し、行き先リストに追加できるようにしたいのですが、リストに追加された時に、『盤』『機器』『器具etc』ごとに集めたいのですが上手くいきません。教えて下さいお願いします。


下記は、ただリストに追加するのみのものです。
 D8:F17 行き先
D8:F11 機器
 D11:F14 盤
 D11:F17 器具etc



Private Sub キャンセルButton_Click()
Unload 行き先追加

End Sub


Private Sub UserForm_Initialize()

With 行き先種別
.AddItem "盤"
.AddItem "機器"
.AddItem "器具etc"
End With

End Sub

Private Sub 追加Button_Click()

Dim insertRow As Long

insertRow = Range("行き先").Rows.Count
Sheets("データ").Unprotect
Range("行き先").Rows(insertRow).Insert Shift:=xlDown

Range("行き先").Cells(insertRow, 2) = 行き先.Text
Range("行き先").Cells(insertRow, 3) = 略称.Text
Range("行き先").Cells(insertRow, 1) = 行き先種別.Text
Sheets("データ").Protect

Unload 行き先追加

End Sub

コメント(10)

ぐっさん(敬称込み)

パッと見ですが、
>  D8:F17 行き先
> D8:F11 機器
>  D11:F14 盤
>  D11:F17 器具etc

名前定義のようですが、他の項目と参照範囲かぶっていたり、
空白(?)の行まで参照範囲となっているようですが、これでいいのですか?

他に既存のもので気になるとこ。
・グレーのセルは空白?
・空白行も参照範囲にしているのはセルの挿入により名前定義を自動で拡大するため?
よっちゃんさん

書き込みありがとうございます

間違ってましたあせあせ(飛び散る汗)
 D8:F17 行き先 (←最初にマクロ考えた時のもので、必要なしになると思います)
D8:F11 機器
 D12:F14 盤
D15:F17 器具etc

>・グレーのセルは空白?
  →空白です
>・空白行も参照範囲にしているのはセルの挿入により名前定義を自動で拡大するため?
   →その通りです


すみませんお手数おかけします 
ぐっさん

であればこんな感じですかね。

Private Sub 追加Button_Click()
  With Range(行き先種別.Text)
    With .End(xlDown).Resize(, .Columns.Count).Offset(1)
      .Insert Shift:=xlDown
      .Offset(-1).Value = Array(行き先種別.Text, 行き先.Text, 略称.Text)
    End With
  End With

  Unload 行き先追加
End Sub

>>0のコードと画像を見ながらVBEで書いただけで実際に動作確認はしてないので
イケてないとこあったら修正してみてください。
実際のステートメントは(Unload以外で)2行ですが、長くなりそうなのでWithステートメントでまとめました。

行き先種別コンボボックスが選択されていなかったり、
スタイルがドロップダウンリストでない状態だと不正な文字が入力できちゃったりすると、
With Range(行き先種別.Text) ステートメントで実行時エラーとなるので、
スタイルをドロップダウンリストにした上で
追加Button_Click()プロシージャの先頭で入力チェック(未選択)にするか、
UserForm_Initialize()プロシージャで .text="盤" を追加するか、
.listindex=0 を追加するなどの対応をしておいた方が無難そうですね。
あ、 protectとunprotectの部分が抜けちゃいましたね。
追加しておいてください^^;
すみません
教えて頂いたのを試してみましたが、挿入される位置がグレーで塗ったセルの上に入りません
入るのもあったり、全然違うところに入ったりします

どうすれば良いのでしょうか?
マクロにうといんで、教えていただけないでしょうか?
ぐっさん

レスに気がつきませんでした。
私の環境(OS=WinXP Pro, Excel2003)で実際に作って動作確認してみました。
ちゃんと動いたんですけど・・・

>>2の通りにセル範囲を指定されましたか?

> 全然違うところに入ったりします
とは、具体的に、どうした場合にどのような結果となるのでしょうか?
すみません

セル範囲を指定したのですが・・・

D8:F11 機器
D12:F14 盤
D15:F17 器具etc
と範囲を設定し、教えて頂いたようにマクロを記入して実行したのですが

?『機器』 所定の位置に追加
?『盤』 所定の位置に追加
?『器具etc 』 は With .End(xlDown).Resize(, .Columns.Count).Offset(1)で引っかかりました

また、『機器』の範囲D9:F10を削除して、『機器』の範囲を縮めたら『盤』の範囲に『機器』が追加されてしまいました


Kusakabeさんへ

その文字化けは、上から順に丸囲み数字の1、2、3です。

--------------------------------------

ぐっさんへ

> (1)『機器』 所定の位置に追加
> (2)『盤』 所定の位置に追加
> (3)『器具etc 』 は With .End(xlDown). 〜中略〜 で引っかかりました

「引っかかった」とは何かしらの実行エラーが発生したということでしょうか?
作成したファイルをUPしてみましたので同じことが再現するか確認してみていただけますか。
http://o123.jp/mixi/Excel/index.html
※下の方の「マクロでの選別 ・・・」の件 です。

あと、
> また、『機器』の範囲D9:F10を削除して
ですが、最初に提示された構成が変わってしまっては、
つまり仕様が変わってしまっては意図しない動きになるのはよくある話です。
サンプルとして提示したのでそこまで考慮してません。

コンボボックスで指定された名前定義の範囲から、
.End(xlDown) (Ctrl+↓の操作)で、データ範囲の最終行の左端のセルと取得し、
その範囲をResizeで名前定義の列の範囲まで拡大し、
その範囲の1行下の範囲を基準にセルを挿入しているのです。

仕様変更後の構成では、データが1行しかないので
.End(xlDown) で「盤」の名前定義範囲に行ってしまったのですね。
プログラムは思った通りに動くのではなく、書いた通りに動きます。
提示されたコードの意味をわかって使わないと修正もできません。

現状のコードを理解された上で、 2つ目のWithステートメントの引数を
.Endを使わずに .Rows.Count を利用して書き換えれば修正できると思いますよ。
どうしても出来なかったら、また聞いてみてください。

この修正が出来れば、データが1行も無い状態(空白行だけ)の場合でも対応できるかと。
あ、でも1番上の機器に関しては上の書式を引き継いでの挿入になるから、
それだけだと黄色塗りつぶしの行になるでしょうね。
運用方法に合わせてコード作成してみてください。

※ぐっさんのために、わざと私が修正しないので悪しからずm(__)m
余談(?)ですが、 >>7 の実行時エラーの原因について。

【予想】
『器具etc』も画像で提示されたものと違って行数を減らしてしまったため、
.End(xlDown) でシート内の最終行が取得され、
.Offset(1) で存在しないRangeオブジェクトの取得を行おうとしたから。
※ぐっさんのコメントから、この可能性は高い。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Excel(エクセル)活用 更新情報

Excel(エクセル)活用のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。