Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7276 / 13645 ツリー ←次へ | 前へ→

【39979】転記したデータの修正 Hiro 06/7/4(火) 21:24 質問[未読]
【39986】Re:転記したデータの修正 Kein 06/7/4(火) 22:14 回答[未読]
【40030】Re:転記したデータの修正 Hi 06/7/5(水) 20:13 質問[未読]
【40034】Re:転記したデータの修正 Kein 06/7/5(水) 21:27 発言[未読]
【40037】Re:転記したデータの修正 Hiro 06/7/5(水) 22:35 発言[未読]
【40036】Re:転記したデータの修正 Hiro 06/7/5(水) 22:33 お礼[未読]
【40045】Re:転記したデータの修正 Kein 06/7/5(水) 23:34 回答[未読]
【40091】Re:転記したデータの修正 Hiro 06/7/6(木) 20:43 お礼[未読]
【40103】Re:転記したデータの修正 Kein 06/7/6(木) 22:12 発言[未読]
【40174】Re:転記したデータの修正 Hiro 06/7/7(金) 19:14 質問[未読]

【39979】転記したデータの修正
質問  Hiro  - 06/7/4(火) 21:24 -

引用なし
パスワード
   こんにちは、よろしくお願いします。
シート(運送予定)から実際に運送が終了したものを
別シート(運送実績)に転記する処理をしております。

データは

A列 B列  C列・・・・・・Z列
No  日付 客名      未

となっており
転記したときに運送予定シートのZ列が
"未"から"済"に変更されます。

このときに予定データの項目を変更した時に
実績シートに転記された内容も変更されるようにと
考え、本を参考に以下のようなコードとして、
思うような処理がされるようになったのですが、

実績シートをアクティブにせずにその項目内容を
変更できないかと思っております。

  Dim myRow As Integer
  Dim C As Range
  Dim Buff As Variant
  Dim Flag As Boolean
  
  Application.ScreenUpdating = False
  Application.EnableEvents = False
  
  Buff = ActiveCell.Value  '予定シートのNo
  Flag = False
  myRow = ActiveCell.Row

  If Cells(myRow, 26).Value = "済" Then
    項目修正            
    Application.CutCopyMode = False
    Intersect(ActiveCell.EntireRow, Range("B:B, D:R")).Copy
    Sheets("実績").Select
      For Each C In ActiveSheet.Range("A:A")
        If (C.Value Like Buff) Then
          C.Offset(0, 1).PasteSpecial (xlPasteValues)
            C.Offset(0, 1).Select
            Flag = True
          Exit For
        End If
      Next C
    Sheets("予定").Select
    Cells(myRow + 1, 1).Select
    取得
  Else
    項目修正
    Cells(myRow + 1, 1).Select
    取得
  End If
  
  With ActiveWindow
     .SmallScroll Down:=1 '---下方向に1列
  End With
  Application.CutCopyMode = True
  Application.EnableEvents = True
  Application.ScreenUpdating = True


項目修正・・・はユーザーフォームのTextBoxの内容をそれぞれのセルに書き込む
       コードを標準モジュールに書いております。
取得・・・・・はセルの内容をユーザーフォームに表示させるコードを標準
       モジュールに書いております。

シートを行き来せずに同じNoを探して
その行をコピーする方法はないでしょうか?
よろしくお願いいたします。

【39986】Re:転記したデータの修正
回答  Kein  - 06/7/4(火) 22:14 -

引用なし
パスワード
   このような処理は、何かのイベントマクロを使ってやるのが便利です。
中でも最も適しているのは、右クリックイベントではないかと思います。
で、以下のコードを運送予定シートのシートモジュールに入れ、処理したい No を
右クリックして下さい。その際、もし複数の No を一気に処理したいなら Ctrlキー
を押しながら左クリックで選択(連続した範囲なら Shiftキー を使う)していき、
最後に右クリックして下さい。ループによって連続処理します。

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, _
Cancel As Boolean)
  Dim Sh As Worksheet
  Dim C As Range
  Dim CkR As Variant

  Set Sh = Worksheets("運送実績")
  For Each C In Target
   If Intersect(C, Range("A:A").SpecialCells(2)) _
    Is Nothing Then GoTo NLine
   If C.Offset(, 25).Value = "済" Then
     CkR = Application.Match(C.Value, Sh.Range("A:A"), 0)
     If Not IsError(CkR) Then
      Intersect(C.EntireRow, Range("B:B, D:R")) _
      .Copy Sh.Cells(CkR, 2)
     Else
      Debug.Print C.Value & " : NotFound"
     End If
   Else
     '項目修正マクロの処理内容を、ユーザーフォームを出す
     '代わりに InputBox で処理するコードをここに書く
   End If
NLine:
  Next
  Set Sh = Nothing: MsgBox "転記処理を終了します", 64
End Sub   

【40030】Re:転記したデータの修正
質問  Hi  - 06/7/5(水) 20:13 -

引用なし
パスワード
   ▼Kein さん:

すみません。興味を持って見させていただいてます。
このような内容に近い作業が出来ると便利になると思うような関連したことをしているからです。
恐れ入りますが、教えてください。
このケースで「未」が「済」とならないのですが、どこが問題なのでしょう。
また、出来ましたらImPutBoxのところを、具体的にどのように書けば良いのでしょうか
アドバイスください。
複数の一気処理にも非常に関心を持ちました。

>このような処理は、何かのイベントマクロを使ってやるのが便利です。
>中でも最も適しているのは、右クリックイベントではないかと思います。
>で、以下のコードを運送予定シートのシートモジュールに入れ、処理したい No を
>右クリックして下さい。その際、もし複数の No を一気に処理したいなら Ctrlキー
>を押しながら左クリックで選択(連続した範囲なら Shiftキー を使う)していき、
>最後に右クリックして下さい。ループによって連続処理します。
>
>Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, _
>Cancel As Boolean)
>  Dim Sh As Worksheet
>  Dim C As Range
>  Dim CkR As Variant
>
>  Set Sh = Worksheets("運送実績")
>  For Each C In Target
>   If Intersect(C, Range("A:A").SpecialCells(2)) _
>    Is Nothing Then GoTo NLine
>   If C.Offset(, 25).Value = "済" Then
>     CkR = Application.Match(C.Value, Sh.Range("A:A"), 0)
>     If Not IsError(CkR) Then
>      Intersect(C.EntireRow, Range("B:B, D:R")) _
>      .Copy Sh.Cells(CkR, 2)
>     Else
>      Debug.Print C.Value & " : NotFound"
>     End If
>   Else
>     '項目修正マクロの処理内容を、ユーザーフォームを出す
>     '代わりに InputBox で処理するコードをここに書く
>   End If
>NLine:
>  Next
>  Set Sh = Nothing: MsgBox "転記処理を終了します", 64
>End Sub

【40034】Re:転記したデータの修正
発言  Kein  - 06/7/5(水) 21:27 -

引用なし
パスワード
   >「未」が「済」とならない
初めの質問内容には、その処理をするマクロのコード、又は数式が具体的に
示されていませんでしたよね。それではこちらとしても、具体的なサンプル
を作ることができませんよ。

【40036】Re:転記したデータの修正
お礼  Hiro  - 06/7/5(水) 22:33 -

引用なし
パスワード
   ▼Kein さん:
ありがとう御座いました。
シートのNoを右クリックで、思うような処理が出来ました。
処理後に右クリックのメニューが表示されるのは、何かの
イベントをFalseにすれば表示されないかと思います。

項目を修正したときに、その行の"入力"列(Z列)が"済"の時に
実績シートも書き換える処理コードをと考えていたもので
何とかコマンドボタンを押した後にこのコードを実行させようと
奮闘してみましたが、Targetのところで、変数の宣言のエラーが
出て私には手に負えそうもありません。
(ユーザーフォームのコンボボックスで選ぶ項目が8つ程あるので
キーボードで文字を入力するよりユーザーフォームで修正した方が、
簡単と思っているもので)

ふと考えてみたのですが、シートのChangeイベントでもこのコードは
実行可能かな?明日にでも再度挑戦してみます。
ご回答ありがとう御座いました。

【40037】Re:転記したデータの修正
発言  Hiro  - 06/7/5(水) 22:35 -

引用なし
パスワード
   ▼Kein さん:
>>「未」が「済」とならない
>初めの質問内容には、その処理をするマクロのコード、又は数式が具体的に
>示されていませんでしたよね。それではこちらとしても、具体的なサンプル
>を作ることができませんよ。

上記の質問は、私がしたものではありません。
私はその部分のコードは、別のイベントで処理しております。

【40045】Re:転記したデータの修正
回答  Kein  - 06/7/5(水) 23:34 -

引用なし
パスワード
   >処理後に右クリックのメニューが表示される
これはコードの冒頭に

Cancel = True

を追加するだけで回避できます。
>コマンドボタンを押した後にこのコードを実行させよう
もし右クリックイベントを止めて、ユーザーフォームのコマンドボタンの
クリックイベントに変えたいなら、冒頭部分は



If TypeName(Selection) <> "Range" Then Exit Sub
Set Sh = Worksheets("運送実績")
  For Each C In Selection



というように変更すれば良いでしょう。
また、このように書き換えたコードなら、任意の適当なタイトルを付けて
標準モジュールに入れておくことで、任意のイベントマクロから
Call ステートメント で呼び出して使うことができます。その場合、例えば
先の右クリックイベントなら

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, _
Cancel As Boolean)
  Cancel = True
  Call 任意のマクロ名
End Sub

というように「そのイベントに特有の引数」のみを、適当な位置に入れる
ようにします。

【40091】Re:転記したデータの修正
お礼  Hiro  - 06/7/6(木) 20:43 -

引用なし
パスワード
   ▼Kein さん:
誠に丁寧なご回答恐れ入ります。
おかげさまで、思った通りの処理が出来ました。
(セルへの書込のコードを入れる場所により、転記処理がされない
ので、少し苦労してました。)

For Each 要素を表す変数 In コレクション&配列
についてこのようなコレクションの使い方もあることに
改めて勉強になりました。ありがとう御座います。

それと一つ聞きたいのですが、
処理中に画面がチラチラと動いてしまうのを
Application.ScreenUpdating でも止まらないのは
どのようなことに因るものなのでしょうか?
よろしければ、お聞かせ下さい。

この度は誠にお世話になりました。今後ともよろしくお願いいたします。

【40103】Re:転記したデータの修正
発言  Kein  - 06/7/6(木) 22:12 -

引用なし
パスワード
   >処理中に画面がチラチラと動いてしまうのを
>Application.ScreenUpdating でも止まらないのは
>どのようなことに因るもの
ScreenUpdating を、先のコードのどこへ入れてますか ?
具体的に示して下さい。

【40174】Re:転記したデータの修正
質問  Hiro  - 06/7/7(金) 19:14 -

引用なし
パスワード
   ▼Kein さん:
こんばんは、
お手数かけます。
Application.ScreenUpdatingのコードは

If TypeName(Selection) <> "Range" Then Exit Sub
  Set Sh = Worksheets("運送DATA")
 
  Application.ScreenUpdating = False '←Falseはこの場所です。
 
  For Each C In Selection
   If Intersect(C, Range("A:A").SpecialCells(2)) _
    Is Nothing Then GoTo NLine







NLine:
  Next

  Application.ScreenUpdating = True '←Trueはこの場所です

  Set Sh = Nothing ': MsgBox "転記処理を終了しました", 64

このコードはどこに書いても同じかと思っておりました。
よろしくお願いいたします。

7276 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free