エクセル2000関連でVBAを勉強し始めました。

A1~C3まで列の名前が入っていて、
A2~C2列以下(データを入れるのはA3~C3,
A4~C4・・で、どの行までデータが入っているかは
分からない状態)が空白か
どうかを調べたい時にはどう書けばよろしいのでしょうか?

・A65536~C65536まで選択し
・上向きにデータが存在するかどうかを調べていって
・最終的にActiveになっている行番号が1であれば
A2~C65536までは空白。
1じゃなければ、データがどこかに存在する。

という方法で調べようかと思ったのですが、

Dim Line As Integer
Range("A65536:C65536").Select
Range(Selection, Selection.End(xlUp)).Select
 Line = Selection.Row

でLineの値で判別しようかと思ったのですがうまく
いきません。何が間違っているのでしょうか?

また、より効率的な方法があったら教えていただき
たいです。お願いします。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

すみませんさっきの回答って意味不明でした。

すみません(汗)
責任とってコード書きます。(って処理多すぎ… )

Sub macro1()'← 一例です。
Dim a$ , a1$ , b$ , b1$ , c$ , c1$ , ln%
Dim chk As Boolean
chk = True
ln% = 65537
Do While chk = True
ln% = ln% - 1
If ln% = 0 Then Exit Do
a1$ = "a" & Trim$(str$(ln%))
b1$ = "b" & Trim$(str$(ln%))
C1$ = "c" & Trim$(str$(ln%))
a$ = Range(a1$).Value
b$ = Range(a2$).Value
C$ = Range(a3$).Value
chk = LenMbcs(a$) = 0 And LenMbcs(b$) = 0 And LenMbcs(C$) = 0
Loop
MsgBox = (ln% & "行目までデータが入力されています。")

End Sub

Function LenMbcs(ByVal str As String)
LenMbcs = LenB(StrConv(str, vbFromUnicode))
End Function

として下さい。
下からA列、B列、C列のいずれにもデータが入力されていなければ、
(いずれもバイト数が0であれば)
一つ上の行を調べ、それでも入力されていなければ… 

…を繰り返し、いずれかの列に文字が入力されている行を見つけると、
その行番号をメッセージボックスで伝えてくれます。

これでいける……はず。なんせ初心者なもんで。(汗)
不足があれば応用して下さい。

注意:空白文字(" "や" ")が入力されているセルも「入力されているセル」と判断します。
   一部、VBのヘルプから引用しています。(LenMbcsの所)
   Macでは不都合を起こします。(Unicodeが無い…らしい)
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

今回は、A列、B列、C列それぞれの列で一番下の行番号を
出し、一番大きい番号を導く、という方法をとりました。

紹介していただいた方法はかなり私には難解なんですが、
また試してみたいと思います。

お礼日時:2001/10/04 22:15

「範囲内の空白セル(空白文字が表示されているセルも含む)の数を返す」


という機能を持つ、
エクセルが用意している関数”countblank”を利用しましょう。

dim a%
a = Application.WorksheetFunction.CountBlank(Range("A2:C65536"))

とします。
これでaが1以上ならデータが入ってるって事で、0なら無いって事ですね。
あとは条件分岐で処理するだけですね。

あとc65536は変数にすれば変更できますよね?
ちなみに空白セルやデータの入っているセル番地を取得するには
別の方法でないといけませんが。
    • good
    • 0

こんにちは。

maruru01です。
A~C列は常に同じ行にデータが入っているとしていいですか?
そうするとたとえばA列だけ見ればいいと思います。
したがって、


Dim Line As Long

Range("A65536").End(xlUp).Select
'Excel2000以外のバージョンでは、総行数が違うことがあるので、
'Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Select
Line = Selection.Row
If Line > 1 then
  MsgBox("データ有り")
Else
  MsgBox("データ無し")
End If


これでは出来ませんか。
もちろん、A~C列の下の方に関係ないデータが入っていたらダメですけどね。
では。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

今回は一つの列だけデータが入っていたり、
離れたデータも見つけるプログラムを作りたかったので、
A列、B列、C列それぞれの列で一番下の行番号を出し、
一番大きい番号を導く、という方法をとりました。
またよろしくお願いします。

お礼日時:2001/10/04 22:13

すみません。

一部訂正です。

最初にセルA1を選択してください。
Lineの取得時の+2は削除してください。

Lineに使用されているセルの行が返るので「3」以下ならデータ行無しの判断です。

あと一点、LineはLongで宣言してください。

この回答への補足

回答ありがとうございます。

D列以降にA~C列以上にデータが入っている場合が
あるので、ActiveCellが使えない状況です。

何か他の方法はないでしょうか?

補足日時:2001/10/04 02:46
    • good
    • 0

毎回、シートが綺麗に初期化されていることが前提です。



'セルA3を選択する
Range("A3").Select

'使用されている(された)最後のセルまで選択する
Line = Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Rows.Count+2

ではいかがでしょうか?
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QEXCEL VBA ワークシートのコピーについて

seaclearsky8です。

一つのブックに何枚ものワークシートを追加して保存するVBAについて
ご教授、よろしくお願いします。

コピー元 

MASTER Book MASTER Workseets

コピー先

Copy Book copy Worksheets


コピー元にはワークシートがMASTERワークシートの一枚しかありません。

その一枚のワークシートに値をVBAで入れていき処理し

コピー先のコピーBOOKにワークシートをコピーしていきたいです。

しかし、MASTERBOOKの処理が何通りかあり、

コピー元の一枚のワークシートに
処理別にデータを写し

コピー先BOOKに

         ワークシート名
ワークシート1 処理1ワークシート 
ワークシート2 処理2ワークシート
ワークシート3 処理3コピー元ワークシート3

という具合にワークシートを複数コピーしたいのですが

処理ごとにデータを代入し、コピー処理はできるのですが。

コピー先BOOK

ワークシート3 処理3ワークシート

だけしかコピーされてないBOOKが作成されます。
上書きされているのだと思われます。

対処法が調べましたが見つけられていません。

すいませんが対処法及び参考VBA等ご教授宜しくお願いいたします。

seaclearsky8です。

一つのブックに何枚ものワークシートを追加して保存するVBAについて
ご教授、よろしくお願いします。

コピー元 

MASTER Book MASTER Workseets

コピー先

Copy Book copy Worksheets


コピー元にはワークシートがMASTERワークシートの一枚しかありません。

その一枚のワークシートに値をVBAで入れていき処理し

コピー先のコピーBOOKにワークシートをコピーしていきたいです。

しかし、MASTERBOOKの処理が何通りかあり、

コピー元の一枚のワークシートに
処理別にデータを写し

コピ...続きを読む

Aベストアンサー

今どういうコードを書いているのか不明なので、とりあえず
「1つのシートを別のブックに複数回コピーする」ための参考ソースを書きます。
コピー元のブックに下記ソースを貼り付けて実行してもらえば
新規ブックにコピー元のシートが3枚コピーされると思います。
(新規ブックを追加しているのでシート数は3枚より多くなります)

Sub copySheet()
Dim masterWb As Workbook
Dim masterSh As Worksheet
Dim copyWb As Workbook

Set masterWb = ThisWorkbook
Set masterSh = masterWb.Sheets(1)
Set copyWb = Workbooks.Add

'ここからが実際のコピー処理です。
'単純に3回コピーメソッドを呼び出して3回コピーしています。
masterSh.Copy before:=copyWb.Sheets(1)
masterSh.Copy before:=copyWb.Sheets(1)
masterSh.Copy before:=copyWb.Sheets(1)

End Sub

今どういうコードを書いているのか不明なので、とりあえず
「1つのシートを別のブックに複数回コピーする」ための参考ソースを書きます。
コピー元のブックに下記ソースを貼り付けて実行してもらえば
新規ブックにコピー元のシートが3枚コピーされると思います。
(新規ブックを追加しているのでシート数は3枚より多くなります)

Sub copySheet()
Dim masterWb As Workbook
Dim masterSh As Worksheet
Dim copyWb As Workbook

Set masterWb = ThisWorkbook
Set masterSh = masterWb.Sheets(1)
Set copyWb = W...続きを読む

QRangeクラスのSelectメソッドが失敗しました。

VB5.0でExcel97のファイルを作成するプログラムを作成しています。
今まで順調にエクセルのほうで、コピーしたり移動したりしていたんですが
以下のようなエラーが出るようになってしまいました。
何のタイミングで出てきたかがわからないので困っています・・。

Exsheet1にアクティブシートを設定しています。
(1)の範囲をコピーして(2)の部分を先頭に貼り付けようとしています。

(1)ExSheet1.Range("A6:Z6").Copy
(2)ExSheet1.Range("A7").Select
(3)ExSheet1.Paste

(2)で、「Range クラスの Select メソッドが失敗しました。」
というエラーが出ます。

前後を詳しく書いていないので、わかりにくいと思いますが
こういったエラーが出る場合の対処方法など教えてください。
よろしくお願いいたします!

Aベストアンサー

エクセルのVBA中だけでは下記はコピーをすることを確認しました。
Sub test01()
Set ExSheet1 = Worksheets("sheet1")
ExSheet1.Range("A6:Z6").Copy
ExSheet1.Range("A7").Select
ExSheet1.Paste
' ActiveSheet.Paste
End Sub
私は前からExSheet1.Range("A7").Pasteのようなのが出来ないのに、そう書いてエラーを起こし、なぜSheetに貼りつけなければ行けないのか不思議だったです。ActiveSheet.Pasteでもだめでしょうね。

QEXCEL VBA ワークシートのコピーについて

seaclearsky8です。

一つのブックに何枚ものワークシートを追加して保存するVBAについて
ご教授、よろしくお願いします。

コピー元 

MASTER Book MASTER Workseets

コピー先

Copy Book copy Worksheets


コピー元にはワークシートがMASTERワークシートの一枚しかありません。

その一枚のワークシートに値をVBAで入れていき処理し

コピー先のコピーBOOKにワークシートをコピーしていきたいです。

しかし、MASTERBOOKの処理が何通りかあり、

コピー元の一枚のワークシートに
処理別にデータを写し

コピー先BOOKに

         ワークシート名
ワークシート1 処理1ワークシート 
ワークシート2 処理2ワークシート
ワークシート3 処理3ワークシート

という具合にワークシートを複数コピーしたいのですが

処理ごとにデータを代入し、コピー処理はできるのですが。

コピー先BOOK

ワークシート3 処理3ワークシート

だけしかコピーされてないBOOKが作成されます。
上書きされているのだと思われます。

対処法が調べましたが見つけられていません。

すいませんが対処法及び参考VBA等ご教授宜しくお願いいたします。

seaclearsky8です。

一つのブックに何枚ものワークシートを追加して保存するVBAについて
ご教授、よろしくお願いします。

コピー元 

MASTER Book MASTER Workseets

コピー先

Copy Book copy Worksheets


コピー元にはワークシートがMASTERワークシートの一枚しかありません。

その一枚のワークシートに値をVBAで入れていき処理し

コピー先のコピーBOOKにワークシートをコピーしていきたいです。

しかし、MASTERBOOKの処理が何通りかあり、

コピー元の一枚のワークシートに
処理別にデータを写し

コピ...続きを読む

Aベストアンサー

> 配列にワークシートのオブジェクトを入れることとか可能なのでしょうか?

それは多分できないと思います。


> 複数のセル・シートを何回もコピーする場合にでるらしいです。

多分、メモリをたくさん使っちゃってるせいでしょうね。
まず、メモリ使用を減らすようにしましょうか。

・testwriteの最後にオブジェクト変数のメモリ解放を行う。
 具体的には以下のように書く。もうやってたらすみません。
Set cbook = Nothing
Set mastersheet = Nothing
・testwriteの中でのブックオープンおよび保存をやめる。
 新規ブックのオープンをtestwriteを呼ぶ前に1度だけ行い、
 testwriteの中ではその新規ブックに対してシートを追加していく。
 そしてtestwriteの処理が全部終わったら、
 新規ブックの全シートを1度に「記録シートYYYY/MM/DD.xls」にコピーする。

それでも駄目でしたら、以下の回答No.1を試してみてください。
http://oshiete.goo.ne.jp/qa/1822561.html

> 配列にワークシートのオブジェクトを入れることとか可能なのでしょうか?

それは多分できないと思います。


> 複数のセル・シートを何回もコピーする場合にでるらしいです。

多分、メモリをたくさん使っちゃってるせいでしょうね。
まず、メモリ使用を減らすようにしましょうか。

・testwriteの最後にオブジェクト変数のメモリ解放を行う。
 具体的には以下のように書く。もうやってたらすみません。
Set cbook = Nothing
Set mastersheet = Nothing
・testwriteの中でのブックオープンおよび保存をやめ...続きを読む

QFor ~ Next の中での Dim宣言について

四角形を下方向にずらしながら繰り返し描きたい場合、
以下のソースのようにFor ~ Next の中での Dim宣言を
行うのは一般的でしょうか。

他にスマートな記述があれば教えてください。
よろしくお願いします。

---------------------------------------
'四角形を下方向にずらしながら描画
For i = 0 To 10
  Dim rect As New Rectangle(x, y* i , w, h)
  g.DrawRectangle(Pen.Black, rect)
Next

Aベストアンサー

RectangleのOffsetメソッドを使うという方向なら Rectangleオブジェクトの生成は1回でいいことになります

dim rect as new Rectangle( x, y, w, h )
for i = 0 to 10
  g.DrawRectangle( Pens.Black. rect )
  rect.Offset( 0, 1 )
next
といった具合です …

QEXCELのVBAでシートコピーをしたとき元のマクロを削除するには?

VBAのマクロでシートのコピーをしたいのですが、元のシートにはVBAのコードが含まれています。コピーするのはデータだけのコピーが必要で、マクロ自体は必要ないのですが、それを削除するコードはどのように書いたらいいのでしょうか?
どうしてもコピーしたファイルを開くと「マクロが含まれています」という確認メッセージが出てしまうのですが、それもなくしたいのです。
シートにフォームのボタンが配置されている場合も同様に、そのボタン自体をなくした状態でコピーを行いたいのですが・・・。プログラムで行うのは不可能なのでしょうか?

Aベストアンサー

No2です。
サンプルコードを書いてみました。
「オリジナル」という名前のシートを別ブックとしてコピペ保存します。

Sub サンプル()
Dim sc As Integer
sc = Application.SheetsInNewWorkbook
Application.SheetsInNewWorkbook = 1
ThisWorkbook.Sheets("オリジナル").Cells.Copy 'コピー
Workbooks.Add 'ブック追加
Sheets("Sheet1").Range("A1").PasteSpecial Paste:=xlValues '値貼り付け
Sheets("Sheet1").Range("A1").PasteSpecial Paste:=xlFormats '書式貼り付け
Sheets("Sheet1").Name = "コピー"
Application.CutCopyMode = False
Application.SheetsInNewWorkbook = sc
ActiveWorkbook.Close
ThisWorkbook.Activate
End Sub

No2です。
サンプルコードを書いてみました。
「オリジナル」という名前のシートを別ブックとしてコピペ保存します。

Sub サンプル()
Dim sc As Integer
sc = Application.SheetsInNewWorkbook
Application.SheetsInNewWorkbook = 1
ThisWorkbook.Sheets("オリジナル").Cells.Copy 'コピー
Workbooks.Add 'ブック追加
Sheets("Sheet1").Range("A1").PasteSpecial Paste:=xlValues '値貼り付け
Sheets("Sheet1").Range("A1").PasteSpecial Paste:=xlFormats '書式貼り付け...続きを読む

QExcelマクロでRange("A1:A5,C1:C5")をCellsで書きたいのですが

マクロ初心者です。
Excelマクロでグラフを作成するときに、元データを指定する所で、
Source:=Range("A1:A5,C1:C5")とするような場合、
「A1」とかアルファベットでの番地指定ではなく、
Cellsを用いて書きたいのです。

Source:=Range("A1:A5")であれば、
Source:=Range(Cells(1, 1), Cells(5, 1))と書けばいいことは分かるのですが、範囲指定を複数にする場合が分からないのです。

よろしくお願いします。

Aベストアンサー

Unionを使用したらできると思います。

Source:=Union(Range(Cells(1, 1), Cells(5, 1)), Range(Cells(1, 3), Cells(5, 3)))

今Excelがインストールされてないパソコンで作業していないので確認はしていないのですが・・・。

よかったら参考にして下さい

QVBAのワークシートの追加とコピーなんですが。

VBAのワークシートの追加とコピーなんですが。


sheet1の原紙をすべてコピーして、

新しくワークシートを追加してそのシートに貼り付けるプログラムを

教えてください。

Aベストアンサー

With ActiveWorkbook
  aaa = .Sheets("Sheet1").Cells(9, 4).Value 'aaaは社員
  bbb = .Sheets("Sheet1").Cells(9, 5).Value 'bbbは4月
  .Sheets("Sheet1").Copy After:=.Sheets(.Sheets.Count)
End With
ActiveSheet.Name = aaa & bbb

QRange("A" & x) + Range("A" & x+1) +

Range("A" & x) + Range("A" & x+1) + Range("A" & x+2) + ・・・ + Range("A" & x+n)

x:変数(基準点)
n:定数(A列のセルをいくつ足し併せるか、を指定。)


上記プログラムをループ的に行うには、どういう書き方をすれば良いでしょうか?
Do ~ Loop 文 などを使うのでしょうか。

お詳しい方、教えて下さい。
必ずお返事致します。

Aベストアンサー

>上記プログラムをループ的に行うには、どういう書き方をすれば良いでしょうか?
>Do ~ Loop 文 などを使うのでしょうか。
との質問には、#1のuruzさんが言われているように、For Nextが適していると思います。

ただ回す考え自体を除外してもよいのであれば、Sum関数を利用した方が、エリアが広い時は高速に処理を行う事が出来ます。


Option Explicit

Private Const x As Long = 1
Private Const N定数 As Long = 65535

Sub Test()
  Dim dbl1 As Double
  Dim dbl2 As Double
  Dim cur結果

  '----------------
  ' 検証1(回す)
  '----------------
  dbl1 = Now
  cur結果 = サンプル1(N定数)
  dbl2 = Now
  MsgBox "サンプル1(回す):" & cur結果 & vbTab & "計測時間" & dbl2 - dbl1

  '----------------
  ' 検証2(Sum)
  '----------------
  dbl1 = Now
  cur結果 = サンプル2(N定数)
  dbl2 = Now
  MsgBox "サンプル2(Sum):" & cur結果 & vbTab & "計測時間" & dbl2 - dbl1
End Sub

Function サンプル1(n As Long) As Currency
  Dim i As Long
  For i = 0 To n
    サンプル1 = サンプル1 + Range("A" & x + i)
  Next i
End Function

Function サンプル2(n As Long) As Currency
  Dim rng始点 As Range
  Dim rng終点 As Range
  Dim rng範囲 As Range
  
  Set rng始点 = Range("A" & x)
  Set rng終点 = rng始点.Offset(n)
  
  Set rng範囲 = Range(rng始点, rng終点)
  サンプル2 = WorksheetFunction.Sum(rng範囲)
End Function

>上記プログラムをループ的に行うには、どういう書き方をすれば良いでしょうか?
>Do ~ Loop 文 などを使うのでしょうか。
との質問には、#1のuruzさんが言われているように、For Nextが適していると思います。

ただ回す考え自体を除外してもよいのであれば、Sum関数を利用した方が、エリアが広い時は高速に処理を行う事が出来ます。


Option Explicit

Private Const x As Long = 1
Private Const N定数 As Long = 65535

Sub Test()
  Dim dbl1 As Double
  Dim dbl2 As Double
  Dim cur結果

  '...続きを読む

QEXCEL2002で、ブック内のワークシートを他のブックに(VBA含む丸ごと)コピーして移す方法

 EXCEL2002で、ブック内のワークシートを他のブックに(VBA含む丸ごと)コピーして移す方法
 普通のやり方では、セルの数字、値だけで、通常は、中身の重要な"関数式"であったり、VBA等のプログラムまで、コピーされることは、ありませんので、そこまで、出来る方法を教えて下さい。

Aベストアンサー

コピー元のBookとコピー先Bookをどちらも開いて
Excel画面上に並べます(左右に並べる方が作業しやすいと思います)

Ctrlキーを押しながら、コピーしたいシートのタブ部分を
クリック長押しすると、+マークと▲マークが出てきます。
マークが出てきたら、新しいBookにドラッグ&ドロップ で
シートコピーが出来ます。

全く同じシートがコピーされ、マクロもコピーされます。

Q重複列があり、その他の列を同じ列にかえす

こういったselect文ってつくれるんでしょうか?
ネットで調べてもこういった答えが見つけられなかったので…
おわかりの方いましたら、よろしくお願いします。

列1  | 列2  | 列3

1    |りんご  |きゅうり
1    |みかん  |なす
2    |かき   |はくさい
2    |なし    |キャベツ
3    |もも    |ごぼう
3    |キウイ  |きのこ



1   |りんご/みかん|きゅうり/なす
2   |かき/なし   |はくさい/キャベツ
3   |もも/キウイ  |ごぼう/きのこ

っていうことがしたいんですが…
列1の重複ごとにまとめて、2、3をまとめて1つの列にいれるような
selectで表示されるような文です。
2、3は一応文字列なので、集計とか考えていないです。

Aベストアンサー

ムリです。

列2の内容を他のレコードの列2とバインドするようなSQLはかけません。用意されていません。
どうしてしたのら、VBとかフォロントエンドで処理をしてください。


人気Q&Aランキング

おすすめ情報