Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2016)
セルのコピー VBA
投稿日時: 19/09/19 15:05:45
投稿者: しん88

やりたいことがあります。
行が1000行ほどあり、文字列、数値が入力さています。
 
E列に「良」と入力されたら
それぞれの行のデータ A列 B列 に入力されている文字列を C列 D列にコピーしたいのです。
 
関数でできないかと考えていたのですが、関数もVBAも初心者で
なかなか進めずにおります。
教えていただけませんでしょうか。

回答
投稿日時: 19/09/19 16:10:57
投稿者: WinArrow
投稿者のウェブサイトに移動

>関数もVBAも初心者で
  
一度に両方を習得するのは、大変だと思います。
 
よくバラずに、まずは、関数をマスタすることをお勧めします。
  
1行目を項目行と考えて
C2セルに
=IF(E2="良",A2,"")
D2セルに
=IF(E2="良",B2,"")
   
C2:D2を選択して、下へフィルドラッグします。

投稿日時: 19/09/19 17:58:17
投稿者: しん88

WinArrow さま
ありがとうございます。
 
下記の関数ですが、先に試してみたのですが、
A2、B2が上書きされるとC2,D2も変わってしまします。
それで、私が知っている関数では
無理なのかと思い
こちらにお尋ねしたところです。
説明不足で申し訳ありません。
 
↓↓↓
 
1行目を項目行と考えて
C2セルに
=IF(E2="良",A2,"")
D2セルに
=IF(E2="良",B2,"") [/quote]

回答
投稿日時: 19/09/19 19:21:57
投稿者: WinArrow
投稿者のウェブサイトに移動

しん88 さんの引用:

下記の関数ですが、先に試してみたのですが、
A2、B2が上書きされるとC2,D2も変わってしまします。

A2,B2が"良"以外の場合、どうするのか?説明がないので
勝手に解釈しました。
 
そうなると、関数では無理ですね・・・・
 
VBAになると思いますが、
コード作成依頼となってしまいます。
 
いかに初心者でも、コード作成依頼は禁止されています。
 
 
 

回答
投稿日時: 19/09/19 19:46:10
投稿者: WinArrow
投稿者のウェブサイトに移動

VBAで対応する場合、
そのマクロをどのようなタイミングで起動(実行)するかという
説明が必要ですが、
  
E2が変わったとき・・・という条件ならば、
Worksheet_Changeイベントプロシジャを使うとよいでしょう。
これはヒントです。

回答
投稿日時: 19/09/19 20:04:20
投稿者: mimi1212

WinArrow様
ありがとうございます。
 
本を見ながら
自分なりにコードを書いてみたのですが、
A列をC列にコピーしたところでおかしな動きをしてエクセルが閉じてしまいました。
なぜ、そうなったのかわかりません。
教えていただけないでしょうか。
 
 
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long
 
  For i = 1 To 1000
   
    If Cells(i, "E").Value = "良" Then
       
      Cells(i, "A").Select
      Selection.Copy
      Cells(i, "C").Select
      Selection.PasteSpecial Paste:=xlPasteValues
   
      Cells(i, "B").Select
      Selection.Copy
      Cells(i, "D").Select
      Selection.PasteSpecial Paste:=xlPasteValues
    End If
  Next i
End Sub
 

回答
投稿日時: 19/09/19 20:06:28
投稿者: simple

横から失礼します。
 
質問者さんはExcelVBAに関する参考書(テキスト)はお持ちですか?
イベントプロシージャの使い方を、何も知らないないところから素手で思いつくことは
いくら優秀な方でも絶対に不可能です。

使いかたについての情報を取得する努力なしには、前には進みません。
 
関連書籍を購入してあればそれに書いてあると思います(私は書籍を推奨)。
ネットであれば、"ExcelVBA Worksheet_Change"などで検索してヒットする
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_event.html
などが参考になるでしょう。
 
Changeイベントプロシージャーの例2などが参考になるはずです。
・Target変数を使った、対象範囲の限定方法。
・Changeプロシージャの中でセルに変更を加えると、それがまたChangeプロシージャを起動させます。
  そのあたりの回避方法。
などがポイントです。
 
上記のサイト記事にはそれらが書かれていますが、
まずは、ご自分でできるところまでコードを作成して、
つまったところがあれば、また質問して下さい。

回答
投稿日時: 19/09/19 20:09:40
投稿者: simple

質問者さんは同じハンドルネームを使って下さい。
ご発言を見ずにコメントを入れてしまいました。
# 私はここまでとさせてもらいます。

回答
投稿日時: 19/09/19 20:51:41
投稿者: WinArrow
投稿者のウェブサイトに移動

イベントプロシジャ
というのは、標準モジュールで記述するVBAとは
少し違います。
 
まず、イベント・・・を日本語に訳すと「事象」です。
要するに、なんらかの事象が発生したとき実行するプロシジャという意味です。
 
Worksheet_Changeイベントとは、シートのどこかのセルが変更された・・というイベントです。
>どこかのセル
ですから、どこのセルなのかをユーザーが探すことはできません。
Targetというセルオブジェクトで、変わったセルを通知されます。
従って、Targetセルのアドレスを判断して、、コード作成者が意図したセルはどうかを判断します。
 
今回の場合は、「E列セルが」ということですから、E列セル以外が変更されても、関係ないからスキップします。
 
以下省略
 
というような考え方でコードを記述します。
 
ループしてセル全部をチェックする必要ありません。
というか、E2が変わっても、E3が変わってもループしますから、
無駄な動きが発生してしまいます。
 
ということで、
イベントプロシジャとは、どんなものか・・という勉強から始めましょう。
奥が深いですよ!

投稿日時: 19/09/21 10:06:14
投稿者: しん88

ありがとうございました。何とか完成いたしました。