Excel VBA質問箱 IV

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

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


169 / 3841 ページ ←次へ | 前へ→

【79076】一つ下のセルに連番を入れたい
質問  ポチョムキン  - 17/5/2(火) 15:55 -

引用なし
パスワード
   VBA初心者です。

下記のようなことを行いたいのですが、どのようにすればよいでしょうか。

あるセルに文字列がある(たとえば「X0001」)
ボタンを押すと、「X0001」の下のセルに「X0002」と入力される。
さらにボタンを押すと、「X0002」の下のセルに「X0003」と入力される。

「X0001」がC列にある場合、まず「X0001」を探しにいくため、
ActiveCell = Sheets("SHEET1").Range("C99999").End(xlUp)
と、探しにいこうと思っていますが、その先がどうしてもうまくいきません。

先輩方、お教えいただければ幸いです。
・ツリー全体表示

【79075】Re:オブジェクトが 必要ですというエラー...
回答  γ  - 17/5/1(月) 18:55 -

引用なし
パスワード
   MaxRow = Cells(MaxRows.Count , 2).End(xlUp).Row
は、
MaxRow = Cells(Rows.Count , 2).End(xlUp).Row
の間違いでしょう。
テキストか何かの写し間違いですか?

その昔は、
MaxRow = Cells(65536, 2).End(xlUp).Row
などと直接、数値を書いていたものですよ。

しかし、Excelのバージョンアップで最大行数が拡大され、
これでは適当でないし、いちいち数値を書くのはいかがなものか、となって、
行数をカウントして、それで最終行を指定することになったのですね。

# これで解決して安心せずに、設定の変更は実行してください。
# 補足すると、
# Option Explicitとは、「変数の宣言をきちんとします」という宣言です。
# そのかわり、宣言していない変数を使っていれば、Excel君がきちんと
# 指摘をしてくれます。
# タイプミスをして変数名の間違いに気づくのに相当時間がかかってしまう、
# などということが避けられますし、大抵のひとはこうした設定にしています。
・ツリー全体表示

【79074】Re:オブジェクトが 必要ですというエラー...
回答  γ  - 17/5/1(月) 18:30 -

引用なし
パスワード
   MaxRowsとは何者でしょうか?
定義されていない変数を使っているのでは?

こうしたことを早期に発見するには、
以下のようにします。

Option Explicit
をモジュールの一行目に挿入するようにして下さい。
そうすれば、今回のような未宣言の変数には警告が出て、
しかも場所を特定してくれますから、原因が直ぐに判明します。

なお、
ツール − オプション − 編集 で
「変数の宣言を強制する」にチェックを入れておけば、
モジュールを作成した時点で、Option Explicitが自動的に挿入されるので、
手間が省けます。
一度だけチェックを入れておけば、以後、気にする必要はありません。
お薦めします。
・ツリー全体表示

【79073】オブジェクトが 必要ですというエラーが...
質問  ざべす  - 17/5/1(月) 17:18 -

引用なし
パスワード
   初めてこちらで質問をさせて頂きます。
業務でツールを作成するにあたり、下記のエラーが発生してしまいます。
状況としては、FindFileで開いたユニークファイルに対し、MaxRowsで指定の列の最大行数を求めようとすると変数にMaxRowの値を格納するコードでエラーが起きます。

コードは下記のように書いています。

Dim MaxRow As Variant

Application.FindFile

MaxRow = Cells(MaxRows.Count , 2).End(xlUp).Row  ⬅ここでエラー【オブジェクトが必要です】が発生

アドバイス、ご意見など頂ければ幸いです。
・ツリー全体表示

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

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

はい、そうです。
・ツリー全体表示

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

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

【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 という変数に代入することで
繰り返し処理ができるのです。

ここまで、よいですか。
大事なところなので、わからなければ、言ってください。
・ツリー全体表示

【79069】Re:BITMAPINFOHEADER とは?
お礼  KEN  - 17/4/25(火) 14:57 -

引用なし
パスワード
   ご丁寧な説明、どうもありがとうございました。
確認し、やってみたところ、問題なく動きました。
勉強になりました。
ありがとうございます。
・ツリー全体表示

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

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

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

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

【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 に繰り返し処理を追加することになります。
・ツリー全体表示

【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セルへ転記されるのですね。

それで間違いありません。
なぜそうなるか理解できますよね。
・ツリー全体表示

【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)構文は基本同様の使い方になるのでしょうか?

重ね重ねすいません。
・ツリー全体表示

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

引用なし
パスワード
   おはようございます。
出張で2日ほど留守にしてしまいました。

早速ですが、引き続き解説ありがとうございます。

resizeの使い方を確認しました。
offsetで選んだセル範囲を拡大(縮小)することができるのですね!

sub test5を以下に記述してみます。

Dim ws転記 As Worksheet
Dim 転記行 As Long
 
Set ws転記 = Worksheets(Worksheets("入力フォーム").Range("B2").Value)
「ws転記は入力フォームのB2に入力された値と同じワークシート名とする。」

転記行 = Day(Worksheets("入力フォーム").Range("B2").Offset(, 1).Value) + 1
「転記行は入力フォームB2の一つ右のセルに入力された値(日付)に1を足した整数」
  
ws転記.Range("B" & 転記行).Resize(, 3).Value = Worksheets("入力フォーム").Range("B2").Offset(, 2).Resize(, 3).Value
「ws転記のB列と転記行の右3つのセル範囲の値を入力フォームのB2の2つ右のセルから3つ分(←つまりD2からG2までです)の値と同じにする。

この解釈で大丈夫でしょうか?
・ツリー全体表示

【79062】Re:VBAを用いて日付を自動判別して、その...
発言  マナ  - 17/4/22(土) 15:08 -

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

test4 は、test5 にすべきでした。
どこを変えたかわかりますね。

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

  転記行 = Day(Worksheets("入力フォーム").Range("B2").Offset(, 1).Value) + 1
  
  ws転記.Range("B" & 転記行).Resize(, 3).Value = Worksheets("入力フォーム").Range("B2").Offset(, 2).Resize(, 3).Value
 
End Sub
・ツリー全体表示

【79061】Re:VBAを用いて日付を自動判別して、その...
発言  マナ  - 17/4/22(土) 14:47 -

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

では、次ですが、

>> ws転記.Range("B" & 転記行).Resize(, 3).Value = c.Offset(, 2).Resize(, 3).Value

>(このコード意味は理解できませんでした。)

Offsetは、理解できているとして、

あわせてよく使われるものにResizeがあります。
test3 を ステップ実行で、確認してみてください。
ステップ実行わかりますよね。

Sub test3()

  Range("B2").Select
  Range("B2").Offset(, 1).Select
  Range("B2").Offset(, 1).Resize(, 3).Select

End Sub


ht tp://excel-ubara.com/excelvba4/EXCEL210.html

-----

で、OffsetとResizeを使って、test2を書き直すと

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

  転記行 = Day(Worksheets("入力フォーム").Range("C2").Value) + 1
  
  ws転記.Range("B" & 転記行).Resize(, 3).Value = Worksheets("入力フォーム").Range("B2").Offset(, 2).Resize(, 3).Value
 
End Sub

になります。
OffsetとResizeは、今後も必ず使うと思います。ぜひ理解してください。

ここまで理解できましたか。
・ツリー全体表示

【79060】Re:VBAを用いて日付を自動判別して、その...
発言  せいじ  - 17/4/22(土) 14:26 -

引用なし
パスワード
   詳しいご説明ありがとうございます!
ここまでは理解できました!

セルに入力された文字や値をそのまま使えるということですね!
・ツリー全体表示

【79059】Re:VBAを用いて日付を自動判別して、その...
発言  マナ  - 17/4/22(土) 14:13 -

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


>ws転記を入力フォームのB2の値とする。

少し違うかも。B2が「山田」なら

Set ws転記 = Worksheets(Worksheets("入力フォーム").Range("B2").Value)

は、

Set ws転記 = Worksheets("山田")

と同じです。

>・ws転記はワークシートなのにrange"B2"の値を代入出来るのですか?


ws転記に代入しているのではなく、ワークシート名にB2の値を使っています。

B2の値を名前とするワークシートをws転記に代入しているのです。

-----

>転記行は入力フォームのC2の値(日付)に1を足したもの?
>・転記行に+1する理由は何でしょうか?

もし、転記先が2行目から始まっているなら、
何月であっても、日+1が転記先の行番号になりませんか。

1日なら、2行目
2日なら、3行目
3日なら、4行目
4日なら、5行目

31日なら、32行目

-----
>転記先のBセルと転記行とDと転記行?を入力フォームのD2〜F2セルを転記する。

転記先.Value=転記元.Value

なので、

ws転記の転記行のB〜D列に、入力フォームのD2〜F2セルを転記する。

です。「左辺に右辺を代入する」です。

>Range("B" & 転記行 & ":D" & 転記行)

の部分は、もし、日付が1/2なら、転記行は3になるので、

Range("B3:D3")

と同じことになります。

ここまで、理解できましたか。
・ツリー全体表示

【79058】Re:VBAを用いて日付を自動判別して、その...
発言  せいじ E-MAIL  - 17/4/22(土) 13:30 -

引用なし
パスワード
   以下の解釈で合っていますでしょうか?

Set ws転記 = Worksheets(Worksheets("入力フォーム").Range("B2").Value)

ws転記を入力フォームのB2の値とする。

  転記行 = Day(Worksheets("入力フォーム").Range("C2").Value) + 1

転記行は入力フォームのC2の値(日付)に1を足したもの?
  
  ws転記.Range("B" & 転記行 & ":D" & 転記行).Value = Worksheets("入力フォーム").Range("D2:F2").Value
 
転記先のBセルと転記行とDと転記行?を入力フォームのD2〜F2セルを転記する。

・ws転記はワークシートなのにrange"B2"の値を代入出来るのですか?
・転記行に+1する理由は何でしょうか?
・ツリー全体表示

【79057】Re:VBAを用いて日付を自動判別して、その...
発言  マナ  - 17/4/22(土) 11:27 -

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

B2に、「川田」
C2に、「1/1」

だとして、これで、1人分のデータの転記です。


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

  転記行 = Day(Worksheets("入力フォーム").Range("C2").Value) + 1
  
  ws転記.Range("B" & 転記行 & ":D" & 転記行).Value = Worksheets("入力フォーム").Range("D2:F2").Value
 
End Sub


↓が転記でよく使わる構文です。

転記先.Value=転記元,Value

もちろん、

転記元,Copy 転記先

でもできます。

まずは、ここまで理解できますか。
・ツリー全体表示

【79056】Re:VBAを用いて日付を自動判別して、その...
発言  せいじ E-MAIL  - 17/4/22(土) 10:31 -

引用なし
パスワード
   返信ありがとうございます!
確認しました。

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", ws入力.Range("B" & Rows.Count).End(xlUp))
”入力フォームのB2セルからB列全てのセルから、Cを取出し”

    Set ws転記 = Nothing
”ws転記”のオブジェクト参照を解除(これは何のためでしょうか?)

    On Error Resume Next
    Set ws転記 = Worksheets(c.Value)
    On Error GoTo 0
”ws転記を変数Cの値のワークシートとする”(すいません、わからないです。)
”エラー発生時には以下より再開する”

    If Not ws転記 Is Nothing Then
”ws転記がnothingでなかったら”(入力があったらという意味?)

      転記行 = Day(c.Offset(, 1).Value) + 1
”変数Cの一つ右のセルの値に1を足す(この場合は日付ですね)

      ws転記.Range("B" & 転記行).Resize(, 3).Value = c.Offset(, 2).Resize(, 3).Value
”ws転記のB列と変数転記行の・・・
(このコード意味は理解できませんでした。)
    
End If
  Next
  
End Sub

ここで変数Cはどのように代入するのでしょうか?
VBA知識が足りず申し訳ございません。
色々と調べたのですがわかりませんでした。
・ツリー全体表示

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