アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記に記載しているものは、開いているエクセルファイル"X"に記載している文字(B列("B2"から記載)に対して、該当する"O"フォルダ内の複数のエクセルファイルを開き、書き込み(ファイルXに記載している事項)をして閉じるPROGRAM(B列記載の文字列を繰り返しで全て処理)なのですが、一番上に記載している文字のもの以外は一度の処理で終わるのですが、一番上の文字のものは何度も同じ処理を繰り返す(最初は書き込みされるが、次は書き込みが空欄で上書きされる)状態で、原因が分かりません。非常に分かりにくいかもしれませんが、もし分かれば、ご教授願えないでしょうか?(当方VBA初心者の為、分かりにくくて申し訳ありません。またおかしい構文があれば、教えて頂けると助かります。

Sub 書き込み()
Dim myPath As String
Dim myFile As String
Dim myFiles As String
Dim 書き込み1 As String
Dim 書き込み2 As String
Dim Number As Integer
Dim Column As Integer

myPath = "C:\O\"
Column = Range("B2").CurrentRegion.Rows.Count

For Number = 2 To Column
myFile = Cells(Number, 2)
書き込み1 = Cells(Number, 1)
書き込み2= Cells(Number, 3)

myFiles = Dir(myPath & myFile & "*.xls*")
If Dir(myPath & myFile & "*.xls*") <> "" Then
Workbooks.Open myPath & myFiles
ActiveSheet.Range("H8") = 書き込み1
ActiveSheet.Range("J4") = 書き込み2
Worksheets.Select
ActiveWorkbook.Close True
Else
MsgBox "処理を中断しました"
Exit For
End If

Next
Complete = MsgBox("処理が完了しました。", vbOKOnly + vbInformation, "確認")

ThisWorkbook.Close SaveChanges:=False

End Sub

質問者からの補足コメント

  • この質問は特に30代・男性の方にリクエストされています!としてしまいしたが、間違えました。
    どなたでも構いません、よろしくお願いします。

      補足日時:2015/04/11 12:55

A 回答 (4件)

> Column = Range("B2").CurrentRegion.Rows.Count



↓ 以下に変更してどうなりますか

Column = Range("B2").End(xlDown).Row

また、

If Dir(myPath & myFile & "*.xls*") <> "" Then



If myFiles <> "" Then


動き)

C:\O\ に *.xls* ファイルが1つ以上あった際、
もし For Number = 2 To Column が余計に回った/空白があった場合
myFile は空白、その空白のままに
myFiles = Dir(myPath & myFile & "*.xls*")
すると C:\O\*.xls* が対象になるので、何かがヒットする
また、If Dir(myPath & myFile & "*.xls*") <> "" Then 
の判別は意味が無い(気分的には、したつもり)

B列の空白を処理しない様に見直す
・余計なループをしない様にする
・空白ならスキップする様にする
等の変更が必要と思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
上手く起動しました。
ちなみに
"CurrentRegion.Rows.Count"と"End(xlDown).Row"の違いってどういうところなのでしょうか??

お礼日時:2015/04/11 20:01

こんにちは。



>一番上の文字のものは何度も同じ処理を繰り返す(最初は書き込みされるが、次は書き込みが空欄で上書きされる)状態で、

これがよく分からないです。一番上というのは、B2のことを指しているのでしょうか?
コード自体よりも、B列のセルの内容次第だと思います。
コード自体では、細かいミスはあっても、それで、誤動作するというところまでは至っていません。

>myFile = Cells(Number, 2)
>書き込み1 = Cells(Number, 1)
>書き込み2= Cells(Number, 3)

これをみると、B列の2行目からの行のA列,B列が対応して書き込まれるというのは分かります。
そして、B列に入っているのは、ファイルベース名です。

例えば、枝番があるような場合は、かなりいい加減になってしまいます。

(こういう書き方ではダメ)
Excel B列          実際のファイル名
 Test-1           Test-1-1a
 Test-1-1           Test-1-1b

または、これもダメ
 Test-1-1
 Test-1-1

>myFiles = Dir(myPath & myFile & "*.xls*")
#1さんとは違った意味で、こういう「*」を使ったワイルドカードは無理があります。

決まったものは、予め実際のファイル名を取得して、ExcelのB列に貼り付けた方がよいです。
もちろん、Dir 関数をループして探す方法もあるのですが、こういう場合、ファイル名と書き込み内容が決められたものなら、ズバリ、B列は実際のファイル名の方がよいと思います。枝番があるものは、同じにするということもできますが、ややこしいように思います。

なお、
>Column = Range("B2").CurrentRegion.Rows.Count
>For Number = 2 To Column

Columnは、プロパティ名ですから、使わないほうがよいです。それに、カウントしているものは、Row( 行)です。For Number =2 は、行数ですから、To [終了値] は、長さではなく、行数でなくてはいけません。

例えば
Rw = Range("B2").CurrentRegion.Rows.Count + 1
For Number = 2 To Rw
Worksheets.Select 全部のシートを選択する意味がよく分かりません。

ざっと見たところ、このようなことが思い当たります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
Rw = Range("B2").CurrentRegion.Rows.Count + 1
の+1の意味を教えて頂けないでしょうか?

Worksheets.Selectはこちらの都合で選択して保存をしております。

お礼日時:2015/04/11 19:59

#1です



> "CurrentRegion.Rows.Count"と"End(xlDown).Row"の違いって・・・

CurrentRegion の動きは理解していますか?
以下、★★ 部分は未入力状態を表現し、A1 からの表示と仮定します

★★ ★★ ★★ D1 ★★
A2 B2 ★★ D2 ★★
★★ B3 C3 D3 ★★
A4 B4 C4 ★★ ★★
A5 ★★ C5 ★★ ★★
A6 ★★ ★★ ★★ ★★
★★ ★★ ★★ ★★ ★★

この時、B2 を指定した Range("B2").CurrentRegion 範囲、
Rows.Count / Columns.Count はどうなるのでしょう?

Public Sub test()
  With Range("B2").CurrentRegion
    Debug.Print .Rows.Count
    Debug.Print .Columns.Count
  End With
End Sub

これで確認してみると、イミディエイトウィンドウへの表示は
6
4
となります

この時の Range("B2").End(xlDown).Row は、4 ですね。
少なくとも空白セルは排除できるかと。
( B3 以降・・・B4,B5 ・・・空白なら、全く変な動きになると思います)
CurrentRegion の状況がわからない状態で +1 は無いと思います。

※ 行数と行位置を勘違いしない様に
上記パターンで D1 が未入力だった以下の場合

★★ ★★ ★★ ★★ ★★
A2 B2 ★★ D2 ★★
★★ B3 C3 D3 ★★
A4 B4 C4 ★★ ★★
A5 ★★ C5 ★★ ★★
A6 ★★ ★★ ★★ ★★
★★ ★★ ★★ ★★ ★★

Range("B2").CurrentRegion の Rows.Count / Columns.Count は
5
4
となります。


> 一番上に記載している文字のもの以外は
これは、タマタマ Dir("C:\O\*.xls*") した結果が一致しただけだと思います
    • good
    • 0

#2の回答者です。



>Rw = Range("B2").CurrentRegion.Rows.Count + 1
>の+1の意味を教えて頂けないでしょうか?

まあ、特殊な条件を言い始めればキリはありません。一応、データが四角形で埋まっていれば、2行目からということですから、最終行は、行幅がひとつ足りませんから、+1 を加えればよいという話です。

こうした話を広げると「たら・れば」になり、その「たら・れば」を言い始めれば、現実を通り越して、どれが正しいか分からなくなります。以下のサイトで、CurrentRegion では、どうやっても、以下のEndプロパティのようには、最終行は取れないことを再度確認したことはありますが、それも、「たら・れば」です。

いずれにしても、ただ、2^20行目(つまり最終行)に行ってしまうことだけ避けられればよいと思います。データの空白によるエラー処理だけすれば、それはそれで十分だと思います。

『VBAを使って、最終行と最終列を見つける5つの方法』
http://www.thespreadsheetguru.com/blog/2014/7/7/ …

ここの話を、『英語カテゴリ』(2015/02/05 #8914221)で書いたことがあります。その表をサンプルして、試してみるのもよいでしょう。(もう2つぐらいありますが。)

それはともかく、これは今回の質問の要点とは違うはずで、私の#2で書いていたB列の内容の部分が、気になる所なのですが……。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!