Excel VBA質問箱 IV

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

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


32 / 13005 ツリー ←次へ | 前へ→

【79047】VBAを用いて日付を自動判別して、その横に貼り付けたい せいじ 17/4/20(木) 14:12 質問[未読]

【79064】Re:VBAを用いて日付を自動判別して、その横... せいじ 17/4/24(月) 8:59 発言[未読]
【79066】Re:VBAを用いて日付を自動判別して、その横... マナ 17/4/24(月) 20:18 発言[未読]
【79067】Re:VBAを用いて日付を自動判別して、その横... マナ 17/4/24(月) 21:05 発言[未読]
【79068】Re:VBAを用いて日付を自動判別して、その横... せいじ 17/4/25(火) 9:04 発言[未読]
【79070】Re:VBAを用いて日付を自動判別して、その横... マナ 17/4/25(火) 19:42 発言[未読]
【79071】Re:VBAを用いて日付を自動判別して、その横... せいじ 17/4/25(火) 20:43 発言[未読]
【79072】Re:VBAを用いて日付を自動判別して、その横... マナ 17/4/25(火) 20:52 発言[未読]

【79064】Re:VBAを用いて日付を自動判別して、その...
発言  せいじ E-MAIL  - 17/4/24(月) 8:59 -

引用なし
パスワード
   ws転記.Range("B" & 転記行).Resize(, 3).Value = Worksheets("入力フォーム").Range("B2").Offset(, 2).Resize(, 3).Value

このコードの
ws転記.Range("B" & 転記行)
"B"を仮に"C"に変えるとCセルへ転記されるのですね。
range(a & a)構文は基本同様の使い方になるのでしょうか?

重ね重ねすいません。

【79066】Re:VBAを用いて日付を自動判別して、その...
発言  マナ  - 17/4/24(月) 20:18 -

引用なし
パスワード
   ▼せいじ さん:

Rangeの使い方としては、

1)こんな感じで、Range()の中にセルアドレスをあらわす文字列を入れる方法
Range("B2")
Range("B2:D2")
Range("B2","D2")

2)または、Rangeオブジェクトを入れる方法
Range(Rage("B2"),Range("D2"))
Range(Cells(2, 2), Cells(2, 4))

3)1)と2)のあわせ技で、文字列とRange オブジェクトを入れる方法
Range("B2", Range("B" & Rows.count).End(xlup))

があります。

で、今回使っているのは1)の文字列でセルを指定する方法です。
3)の方法も、あとで使うことになります。


-----
つまり、

Range("B" & 転記行)

この( )内の、"B" & 転記行 は、セルアドレスを示す文字列ということです。

「&」は、前後の文字列を連結するという意味で、

転記行が2に決っているなら、「&」なんて使わなくても
"B2" という文字列をRange()の中に入れ
Range("B2")
と書けばよいのですが、

実際は、日付によって数字部分が変化するので

"B" & 転記行

とすることで、

転記行が3の場合は、Range("B3")
転記行が5の場合は、Range("B5")

となります。
こんな感じで、「転記行」という変数を使えば
日付がいつであっても、目的のセルに転記できるようになります。

>"B"を仮に"C"に変えるとCセルへ転記されるのですね。

それで間違いありません。
なぜそうなるか理解できますよね。

【79067】Re:VBAを用いて日付を自動判別して、その...
発言  マナ  - 17/4/24(月) 21:05 -

引用なし
パスワード
   ▼せいじ さん:

ここまで理解できたとして

test5 で、

> Worksheets("入力フォーム").Range("B2")

が何度もできてくるので、こういうときも変数を使うとよいです。
こんな感じです。

Sub test6()
  Dim ws入力 As Worksheet
  Dim ws転記 As Worksheet
  Dim c As Range
  Dim 転記行 As Long
 
  Set ws入力 = Worksheets("入力フォーム")
 
  Set c = ws入力.Range("B2")
  
  Set ws転記 = Worksheets(c.Value)

  転記行 = Day(c.Offset(, 1).Value) + 1
  ws転記.Range("B" & 転記行).Resize(, 3).Value = c.Offset(, 2).Resize(, 3).Value
 
End Sub


だんだん、最初に提示したコードに近づいているのがわかりますか。
このあと、test6 に繰り返し処理を追加することになります。

【79068】Re:VBAを用いて日付を自動判別して、その...
発言  せいじ E-MAIL  - 17/4/25(火) 9:04 -

引用なし
パスワード
   おはようございます。

rangeの使い方理解しました。
例えばA3セルを選択したい場合は、
range("A3")やrange("A" & "3")でも使えるということですね。

変数についてはなかなか難しいですね。
何を変数とするかは今後多くのVBAを作り慣れていかないとダメだなと思いました。
ただヒントとしてはコードの中で多く出てくるものは変数に
置き換えて簡略化できるということはわかりました。

【79070】Re:VBAを用いて日付を自動判別して、その...
発言  マナ  - 17/4/25(火) 19:42 -

引用なし
パスワード
   ▼せいじ さん:

では、次です。

test6 だと、転記できるは、1人分(B2の行)のみです。
これを、3人分(B2、B3、B4の行)のデータを転記できるようにします。

For each〜Nextという繰り返し処理の構文を使います。
ht tp://kabu-macro.com/word/a-z/for_each_next.html

Sub test7()
  Dim ws入力 As Worksheet
  Dim ws転記 As Worksheet
  Dim c As Range
  Dim 転記行 As Long
 
  Set ws入力 = Worksheets("入力フォーム")
  
  For Each c In ws入力.Range("B2:B4")

    Set ws転記 = Worksheets(c.Value)
  
    転記行 = Day(c.Offset(, 1).Value) + 1
    ws転記.Range("B" & 転記行).Resize(, 3).Value = c.Offset(, 2).Resize(, 3).Value
  
  Next

End Sub

test6 と見較べてください。

> For Each c In ws入力.Range("B2:B4")

ws入力.Range("B2:B4")のセル範囲から順番に、B2、B3、B4をとりだし、
c という変数に代入することで
繰り返し処理ができるのです。

ここまで、よいですか。
大事なところなので、わからなければ、言ってください。

【79071】Re:VBAを用いて日付を自動判別して、その...
発言  せいじ E-MAIL  - 17/4/25(火) 20:43 -

引用なし
パスワード
   通常変数に値やオブジェクトを代入する時は
"="やset *** ="を使いますが、For each〜Next構文はその代入も兼ねていると
いうことでしょうか?

【79072】Re:VBAを用いて日付を自動判別して、その...
発言  マナ  - 17/4/25(火) 20:52 -

引用なし
パスワード
   ▼せいじ さん:

はい、そうです。

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