[[20080423091646]] 『マクロ記録したものを関数化したい』(nori) ページの最後に飛ぶ

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

 

『マクロ記録したものを関数化したい』(nori)
 excel ver 2000
 windows ver 2000

 下のコードは、マクロ記録で作ったもので、それなりに動いているのですが、問題は
 データを入力した後にボタンを押して処理した後に追加があった場合に、
 先に処理の終わっているところがエラーになってしまいます。
 そこでセルに関数を貼り付けておけば問題を回避することができるのでは?考えました。
 しかしながら、VBAは全くの素人、皆目見当がつきません。どなたか教えていただけませんでしょうか?
 よろしくお願い足します。

 Private Sub CommandButton1_Click()

 Application.ScreenUpdating = False
 Application.DisplayAlerts = False

    With Worksheets("物品請求用")
        .Activate
        .Range("C11:C30").TextToColumns Destination:=Range("C11"),  
 DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
        Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
        :=Array(Array(1, 2), Array(2, 2))
    End With

 Application.DisplayAlerts = True
 Application.ScreenUpdating = True

 End Sub

 追加とは?

 どうしたいのかよく分かりませんが、
 セルのスペースを含む文字列を区切り位置で分ける処理のようなので、
 処理後はスペースが見つからないためエラーが起きると思われます。
 on error resume next と .activate の後に入力するとエラーは回避されます。

 (1or8)


 lor8さん、ありがとうございます。説明が足りずごめんなさい。
 教えていただいたこと試してみました。
 空白で切り分けたものがその右側のセルに入るように設定しているのですが、現在のままですと、
 仮に ボールペン 黒、
    ボールペン 赤 と入力しボタンを押すと
    ボールペン  | 黒
    ボールペン  | 赤 となりますが、
 ここで、インデックス 大:赤と入力(追加)してボタンを押すと
 上で入れたものが消えてしまいます。
 エラーは出なくなったのですが、消えてしまうのでは役に立たないのです。
 よろしくお願いいたします。


 追加の意味が分かりませんが・・・ (1or8)

 処理したいデータが後で増えた場合、下の行に追加入力して、再度実行する、
 と云うことと解釈いたしました。

 追加は必ず「下の行」に入力する、と云うことであれば (つまり、処理済データは変更しない、と云う前提で↓)

  Private Sub CommandButton1_Click()
  Dim LastRwC As Long
  Dim LastRwD As Long

     With Worksheets("物品請求用")
         .Activate

          LastRwC = .Range("C65536").End(xlUp).Row
          LastRwD = WorksheetFunction.Max(10, .Range("D65536").End(xlUp).Row)
          If LastRwC <= LastRwD Or LastRwD >= 30 Then Exit Sub

         .Range("C" & LastRwD + 1 & ":C30").TextToColumns Destination:=Range("C" & LastRwD + 1), _
          DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
          Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
         :=Array(Array(1, 2), Array(2, 2))
     End With

 End Sub

 ※こう云うものは、今回必要ないような気がしましたので、オミットしました。m(__)m
   ↓
 Application.ScreenUpdating = False
 Application.DisplayAlerts = False

 ※ ところで、一番下の行が30行目らしいのですが、ちょっと少なすぎる様な気がします。
    単なるサンプルコードかも知れませんが、その場合、上の変更をフォローできますか?
  『VBAは全くの素人』とのことなのでチョット不安。。。

 (半平太)

 半平太さん、ありがとうございます。
 書式となっており、この行数で大丈夫です。各シートに書き込まれたものを集計表転記し、対で提出することになっております。
 早速、試してみます。
 まことに勝手なお願いなのですが、普通の関数のようにセルに貼り付けておいて入力があると、
 それに対応して、切り分けができるようにするための考え方を教えていただけませんでしょうか?
 参考書を調べながら挑戦してみたいと思います。
 よろしくお願いいたします。
↑半角スペースを入れると整形されます(14:04)

 >普通の関数のようにセルに貼り付けておいて入力があると、

 関数ですと、同じセルでは処理できません。
 (別のセルに入れるので、元データはC列に入ったままになります) 

 もし、同じセルからスタートして分割配置したい、と云うことですと、
 入力確定操作を「トリガー」にして起動するマクロを作ることになります。

 どちらでしょうか?

 あと、入力は一つのセル毎ですか? それともどこかから数行分コピーして貼り付けるのですか?

 (半平太)

半平太さん、お世話になります。(nori)

 今、仮に C11セルにボールペン 赤と入力したとすると、
 C11にボールペン D11に赤が入ることを予定しております。

 なぜこのようなことをするかと言うと、経理係に提出するとき、
 品名欄(C列)には、品名だけで、そのほかのモノが付加されていては
 なら無いという決まりがあるそうでそれをクリアーするためです。

 なお、C列の品名入力欄は、リストボックスになっており、
 しかもVlookUp関数の検索値にもなっている関係で品名を特定できるようなデータが入っております。

 C列に入っているデータを分けた後、他のセルで結合し、
 それが実際の検索値になると言うような回りくどいことをやっているのですが、
 自分の現在の知識では、これくらいのことしかできませんでしたので・・・

 VlookUp関数で他のセルには、その商品が掲載されているカタログ名、ページ数、注文単位等が流れ込むようになっており、
 ここまでは完成しております。

 トリガーがどのようなものか分からないのでなんと言えないのですが、上の説明でお分かりいただければ幸甚です。

 >今、仮に C11セルにボールペン 赤と入力したとすると、
 >C11にボールペン D11に赤が入ることを予定しております。

 >なお、C列の品名入力欄は、リストボックスになっており、

 上の二つの記述を両立するものとして理解するのが難しいのですが、
 リストは「ボールペン 赤」で一つの選択肢になっているのですか?

 分ける場合、必ず2つまでですか?(3つ以上はないですね?)

 >トリガーがどのようなものか分からないのでなんと言えないのですが、
 トリガーとはきっかけで、普通は「データを入れて、Enterキーを押す」ことです。
 今回の場合は、「リストボックスから選ぶ」と云うことが、それに当たりそうです。

 ここで云う「リストボックス」とは何ですか?
  入力規則のリストから選択のことですか? そうでない場合、
  (リストボックスは色々あるので)どの様に作ったものかご説明いただけませんか?

 (半平太)

説明が下手でご迷惑をおかけいたします。
 C列は入力規則のリストです。リストには、入力する人が分かりやすいように「ボールペン 赤」「絵の具 水色」、シャープペンシル替芯 HB」等にしてあります。
 リストから欲しいものを選び、選択が終わった段階でボタンを押してもらうことを想定していたのですが、もう一品欲しくなり、リストから選択し、ボタンを押すと先に入力し、
切り分けていたものがパー。
 その結果、ほかのセルでC列とD列の値を結合して、その値を検索値とするVlookUp関数が上手く機能しなくなってしまうのです。
             リスト
   A     B     C     D     E     F     G       P
          
           ボールペン 赤                     操作前  
           ボールペン    赤                  操作後 ココで結合し真の検索値にする

                         E,F,Gには、Vlookup関数を使い値が入る

この様な操作をさせていますので分けるのは、2つです。
宜しくお願い致します。


 1) 入力シートの「シート見出し」を右クリックして、[コードの表示]をクリック

 2) 画面中央の白いところに下記コードをコピペ

 3) Alt + F11 でエクセル画面に戻る

 以上で入力準備完了です。入力の都度、分割されます。

  もし何かトラブって、シートが反応しなくなったと感じたときは、
 「反応回復」の方を走らせてください。

 Private Sub Worksheet_Change(ByVal Target As Range)
 Dim varAry
    If Target.Count > 1 Then Exit Sub
    If Target.Value = "" Then Exit Sub

    If Not Intersect(Target, Range("C11:C30")) Is Nothing Then
        varAry = Split(Replace(Target.Value, " ", " "), " ")

        Application.EnableEvents = False
            Target.Offset(, 1) = ""                 '後刻追加 右隣を強制空白化
            Target.Resize(, UBound(varAry) + 1).Value = varAry
        Application.EnableEvents = True

    End If
 End Sub

 Sub 反応回復()
     Application.EnableEvents = True
 End Sub

 (半平太)

 >C列に入っているデータを分けた後、他のセルで結合し、
 >それが実際の検索値になると言うような回りくどいことをやっているのですが、
 というご説明ですので、その様にせざるを得ない部分が有るのでしょうけど
 「他のセルで結合」の方のセルにリストボックスを設けるのでは
 駄目なのですかね?

 入力(選択)するセルと、提出するセルに
 同じセルを使用する設計なのに書式が違う
 から、この様な事に成っているのですよね?

 どうしてもC列で選択させたいのなら
 提出用には別シートのC列を使っても
 良さそうに思いますが・・・。

 >経理係に提出するとき、
 その他の制約が有るのかもしれませんので
 まぁ、「詳しく説明が無いと、いろんな事を考える人が居るよ」
 程度に流してください。

 (HANA)

(HANA)さん、アドバイスありがとうございます。
仰ったと同じようなこと試してみたのですが、(C列もD列もリストにし、その中から選んでいただき、
他のセルでそれを結合し、結合したデータを検索値とする。と言うような方法)分かり辛いのと、リスト
から選ぶのに手間が以外にかかるのが分かり、やめました。
半平太さんに教えていただいたコード、私の操作が悪いのか、全く何も起こらないのです。
もう一度、教えていただければありがたいのですが・・・
よろしくお願いいたします。


 ・・・私はその様な事は書いていませんが?

 たとえば、
 >他のセルでそれを結合し
 のセルがA列のセルだとすると
  A列のセルで選択し、C列とD列に振り分け
   A列のセルを検索値とする
 です。

 ご理解いただけますかね?

 >C列もD列もリストにし、その中から選んでいただき
 これでは分かりづらいと言う以上に別の問題も出てきます。

 (HANA)

 >全く何も起こらないのです。
 >もう一度、教えていただければありがたい

 私にはあれ以上記述しようがありません。m(__)m

 コピペするとき、 入力シートの「シート見出し」を右クリックしてから始めましたか?
 (換言すれば、いままでコードを書いていた標準Moduleシートにコピペしていないですか? )

 (半平太)

 半平太さん、そしてHANAさん、大変有難う御座いました。
 やはり、VBAは敷居が高すぎました。繰り返し、試したのですが、駄目でした。
 そこで、HANAさんのアドバイスを参考にして、
 1 A列に検索値を決めるリストを作る A列は、印刷範囲から外す。
 2 次に
  =IF(A14="","",LEFT(A14,FIND(" ",A14,1)-1))
  =IF(A14="","",REPLACE(A14,1,FIND(" ",A14,1),""))
 A列に入力されたデータから切り離したデータが入るセルに上記の式を設定し、オートフィルする。と言うやり方に方針転換しました。
何とか動いているようなのです。
今後の勉強のために、上記のような数式を実現するVBAのコードはどのようになるのでしょうか?
ご教示頂ければ幸甚です。


 それではまずお尋ねしますが
 >半平太さんに教えていただいたコード、私の操作が悪いのか、全く何も起こらないのです。
 と言う事ですが、このページからコピーした後は
  どこに貼り付け(貼り付ける画面はどの様に表示したか)
  どの様に実行する事を試みたのか
 そちらで行った操作を詳しく教えて下さい。

 >繰り返し、試したのですが、駄目でした。
 と言うご申告だけではどこで思い違いをなさって居られるのか分かりません。

 (HANA)

 HANAさん、お世話になります。お返事が遅れた事、お詫びいたします。
 お尋ねの件ですが、ここから、コピーし、作成中のシートのタブを右クリックし、コード表示を左クリック
 VBEのメニューから上書き保存をしてVBEを閉じ、エクセルに戻り、データを入れる。データの間のスペース
を半角にしたり、全角にして試す。画面上に何の変化も現れませんでした。

 半平太さん、HANAさん、失礼いたしました。
 改めて、試してみました。動作いたしました。
 手を加えて、組み込んでみます。有難う御座いました。

コメント返信:

[ 一覧(最新更新順) ]


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