VBでExcelデータ(Excel97)をAccessデータベース(Access97)に落とし込む処理をしたいのですが、空白行を含むExcelデータのレコードカウントを取得するにはどうしたら良いでしょうか?アドバイスよろしくお願いします。

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

A 回答 (4件)

御免なさい!


かなり的外れな答えでした。
スミマセン。
質問の方ですが、VBは「VB6.0」ですか?「VBA」ですか?
>レコードカウントを取得
とは変数への取得ということでしょうか?

この回答への補足

言語はVIsualBasic6.0です。レコードカウント取得は変数格納ということでご指摘のとおりです。

補足日時:2002/03/11 13:43
    • good
    • 0
この回答へのお礼

VB6.0でExcelデータの最終行を取得する方法が見つかりました。マクロでの制御も勉強になりました。アドバイスくださったみなさん、ありがとうございました。

お礼日時:2002/03/11 16:09

以前AccessデータをExcelデータに落とし込んで関数で帳票を作った時


のソースです。
※ちなみに私はトーシロですので正しい書き方とは思っておりません。
「とりあえず動けばイイヤ!」と思った際に参考にして下さい。
'-----------------------------------------------------------------
'処理(セルの値を取得し印刷範囲を設定する。その上で印刷を行いAcに戻る。)
Dim RetVal As String  '変数宣言「Shell起動」
Dim vPath As Variant  '変数宣言「Pathを取得」
Dim intPr1 As Long   'IFに使用するセルの値を取得
Dim intPr2 As Long   'IFに使用するセルの値を取得

'変数に特定のセルの値を代入
intPr1 = Worksheets("ファイル名").Range("C46").Value
intPr2 = Worksheets("ファイル名").Range("C100").Value

'もし変数の値が"0"の場合は、改ページプレビュー位置をA1~CG54に設定
If intPr1 = 0 And intPr2 = 0 Then
ActiveSheet.PageSetup.PrintArea = "$A$1:$CG$54"
End If
'もし2pの値が"1"の場合は、改ページプレビュー位置をA1~CG108に設定
If intPr1 = 1 And intPr2 = 0 Then
ActiveSheet.PageSetup.PrintArea = "$A$1:$CG$108"
End If
'もし3pの値が"1"の場合は、改ページプレビュー位置をA1~CG162に設定
If intPr1 = 1 And intPr2 = 1 Then
ActiveSheet.PageSetup.PrintArea = "$A$1:$CG$162"
End If


'印刷。
ActiveWindow.SelectedSheets.PrintPreview 'プレビュー

'印刷は↓
'ActiveWindow.SelectedSheets.PrintOut Copies:=1

'Accessが置いてあるPath名を変数に代入。
vPath = "c:\Test.mdb"

'Access起動(※端末により異なる。)
RetVal = Shell("""" & "C:\Program Files\Microsoft Office97\Office\MSACCESS.EXE" & """" _
& """" & vPath & """", 1)
'改ページプレビューを元の位置に戻す。
ActiveSheet.PageSetup.PrintArea = "$A$1:$CG$162"
ActiveWorkbook.Save '保存する。
Application.Quit '終了する。
'-------------------------------------------------------------
※質問は受け付けますが、ご批判は勘弁してください。
(少なくとも動きました。)
    • good
    • 0

使用している最終行を求めるマクロを書いてみました。

ExcelVBAで動かす例です。
使用している列について、下から上に向かって調べています。
当方、Excel2000ですがExcel97でも問題ないと思います。ご参考に。

Sub GetmaxRow()
  Dim maxCol As Integer, wkCol As Integer, col As Integer '最大列、列、カウンタ
  Dim MaxRow As Long, wkRow As Long, rw As Long '最大行、行、カウンタ

  '使用している一番右の列を求める
  maxCol = 1
  For rw = 1 To Range("A1").SpecialCells(xlLastCell).Row
    wkCol = Cells(rw, 256).End(xlToLeft).Column
    If maxCol < wkCol Then maxCol = wkCol
  Next

  '使用している一番下の行を求める
  MaxRow = 1
  For col = 1 To maxCol
    wkRow = Cells(65536, col).End(xlUp).Row
    If MaxRow < wkRow Then MaxRow = wkRow
  Next
  MsgBox "一番下の行は " & MaxRow & " です。"
  'MsgBox "一番右の列は " & maxCol & " です。"
End Sub

この回答への補足

アドバイスありがとうございます。VBAで実行確認できました。同様のことをBisualBasicでしたいのですが、なかなかうまくいかないのでちょっと手間取っています・・・。VBでも同じことをされたことがありましたら、教えていただけると嬉しいです。

補足日時:2002/03/11 13:32
    • good
    • 0

Excel97ではサポートされているか分かりませんがExcel2000では



Sheets(シート名).Range("A1").SpecialCells(xlLastCell)

で入力されている最後のセルを取得できます。
行数を取得するのでしたら

rowcount = Sheets(シート名).Range("A1").SpecialCells(xlLastCell).row

でできないでしょうか?

この回答への補足

アドバイスありがとうございます。上記の内容ですが、マクロのみで使用されるコーディングなのでしょうか?Excel97,Excel2000でも試してみたのですが、「アプリケーション定義またはオブジェクト定義のエラー」で動作確認できませんでした。他に参照設定などの環境設定が必要なのでしょうか?

補足日時:2002/03/11 13:10
    • good
    • 0

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

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

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

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

Qフェッチでデータが上書きされます

こんにちは。perl + html + mysqlのコーディングで悩んでいるので質問させてください。
複数フィールド+複数件(例えば13フィールド+3件)のデータがテーブルに存在する時、SELECT文でそのデータを取得したいとします。
分からない所はフェッチの部分なのですが、

$i=0;
while($selectdata[$i]=$sth->fetchrow_arrayref(
$i++;
}

----[中略]-----

for($i=0;$i<$rows;$i++){
print "[SELECTデータ->$i]\n";
for($j=0;$j<13;$j++){
print "$selectdata[$i][$j]\n";
}
print "<BR>\n";
}

表示されたデータが3件とも、3番目のデータが表示されます。
フェッチで取得したデータを配列にいれる段階で、上書きしているような気がするのですが、具体的にどこが悪いか分かりません。
ご教授お願いいたします。

こんにちは。perl + html + mysqlのコーディングで悩んでいるので質問させてください。
複数フィールド+複数件(例えば13フィールド+3件)のデータがテーブルに存在する時、SELECT文でそのデータを取得したいとします。
分からない所はフェッチの部分なのですが、

$i=0;
while($selectdata[$i]=$sth->fetchrow_arrayref(
$i++;
}

----[中略]-----

for($i=0;$i<$rows;$i++){
print "[SELECTデータ->$i]\n";
for($j=0;$j<13;$j++){
print "$selectdata[$i][$j]\n";
}
...続きを読む

Aベストアンサー

いや、
>$i=0;
>while($selectdata[$i]=$sth->fetchrow_arrayref(
>$i++;
>}
これを

my @selectdata;
while ( my $array_ref = $sth->fetchrow_arrayref ) {
push @selectdata, [ @{$array_ref} ];
}

みたいな感じで受け取ったリファレンスを一旦デリファレンスして、
その要素を含む新しい無名配列を生成すれば良いと思いますけど。

QExcel 重複データを含むデータ数のカウント

Excel2003を使用しています。

重複データを1つとして数え、セルK12:K473の範囲(空白セルあり)にあるデータの個数を求める数式を過去の質問を参考にして、下記のように入力しました。

【数式1】
=COUNT(INDEX(1/(MATCH(K12:K473,K12:K473,0)=ROW(K1:K462)),0))

→結果は44でした。


空白セルを除いた状態のK列のデータをM列にコピペし、これも過去の質問を参考にして、下記のように入力しました。

【数式2】
=SUMPRODUCT((MATCH(M12:M84,M12:M84,0)=ROW(M1:M73))*1)

→結果は43でした。

職場で使用しているシステムへの入力漏れがないかをチェックしたくて、上記のようなことをしたのですが、入力した件数をシステムで検索した結果は43件でした。
最初は【数式1】で得た結果とシステムでの検索結果が合わないので、ひとつひとつ確認したのですが、入力漏れもなかったので、試しに【数式2】で調べてみると、システムでの検索結果と合致しました。

【数式2】では空白セルを含む場合はエラーが出るようでしたので、【数式1】でチェックしようとしたのですが、正しい結果が得られなかったのは、私の入力した【数式1】が間違っているのでしょうか?

Excel2003を使用しています。

重複データを1つとして数え、セルK12:K473の範囲(空白セルあり)にあるデータの個数を求める数式を過去の質問を参考にして、下記のように入力しました。

【数式1】
=COUNT(INDEX(1/(MATCH(K12:K473,K12:K473,0)=ROW(K1:K462)),0))

→結果は44でした。


空白セルを除いた状態のK列のデータをM列にコピペし、これも過去の質問を参考にして、下記のように入力しました。

【数式2】
=SUMPRODUCT((MATCH(M12:M84,M12:M84,0)=ROW(M1:M73))*1)

→結果は43でした。

職...続きを読む

Aベストアンサー

>空白セルを除いた状態のK列のデータをM列にコピペし、

どのような操作で空白セルをのぞいたのでしょうか?

元データがエクスポートしたデータ数式や得られた値を「値」に変換した場合は、空白セルが文字数0の文字列となることがあります。
このとき、オートフィルタで「空白セル以外」を選択すると、本当の空白以外の空白文字列も選択対象になる(実際の空白セルと同じとみなされる)ので、実際に文字列が入力されたデータだけを抽出できます。

しかし、元データには空白文字列が混入している場合は、実際の値よりも1大きい値が表示されることになるわけです。

このような場合は、その列を選択して。「データ」「区切り位置」で「完了」すると、空白文字列を本当の空白セルに変更できます。

これを確認するには、どこかのセルに「=TYPE(空白に見えるセル)」の数式を入力するとで2が返ります。

QiPhone「データの取得方法」について

こんにちは。先々月くらいにiPhoneを購入した者です。
iPhoneの「データ取得方法」について質問があります。
予想外にパケット通信料の請求が多かったため、サファリや天気など通信
を必要とするアプリを使用しないようにし、「データの取得方法」をフェ
ッチの15分ごとに変更しました。ただ、「データの取得方法」のプッシュ
とフェッチの違いがよく分かっておらず、プッシュをONにしたままが通信
の節約になるのか、それともフェッチの15分間隔(若しくは30分)が良い
のか分かりません。メールの量は送受信併せて1日30~40で、使わない時
は全く使いません。ただ緊急を要するメールもあるので手動でのメール
取得は考えていません。
前述したように、プッシュとフェッチどちらがパケットの節約になるのか
教えていただきたいと思います。その他パケット通信節約のための小ネタ
などがあれば教えてください。
よろしくお願い致します。

Aベストアンサー

ExchangeServerやMobileMeなど、サーバ側から自動的に送られてくるメールがプッシュメール、通常のメールのように自分から取りに行くメールがフェッチです。
プッシュであれば一定時間ごとにメールボックス確認に行く手間がないため、その分安くはなります。
が。通常のメールをプッシュで使うことはできないので、基本的に選択肢はあってないようなものです。
ExchangeServerやMobileMe使ってなければ、回答としては変わらないってことになります。

ただ、基本的に通信をおこないまくる携帯なので、パケット通信はかかるもんだと思っておいたほうがいいです。

Q空白セルを含む最終行変動データ行列で、特定の二つの列の空白セルのみに○を入力するマクロコードを教えて

空白セルを含む最終行変動データ行列で、特定の二つの列の空白セルのみに○を入力するマクロコードを教えて下さい。

Aベストアンサー

こんばんは!

>特定の二つの列・・・
とは具体的にどの列か判らないので、A・B列としてみました。

空白セルとは数式などによって空白に見えるセルではなく、何もデータがないセルだとします。

Sub Sample1()
Dim j As Long, lastRow As Long
For j = 1 To 2
lastRow = WorksheetFunction.Max(lastRow, Cells(Rows.Count, j).End(xlUp).Row)
Next j
If lastRow > 1 Then
On Error Resume Next '//←念のため//
Range(Cells(1, "A"), Cells(lastRow, "B")).SpecialCells(xlCellTypeBlanks).Value = "○"
End If
End Sub

こんな感じではどうでしょうか?m(_ _)m

こんばんは!

>特定の二つの列・・・
とは具体的にどの列か判らないので、A・B列としてみました。

空白セルとは数式などによって空白に見えるセルではなく、何もデータがないセルだとします。

Sub Sample1()
Dim j As Long, lastRow As Long
For j = 1 To 2
lastRow = WorksheetFunction.Max(lastRow, Cells(Rows.Count, j).End(xlUp).Row)
Next j
If lastRow > 1 Then
On Error Resume Next '//←念のため//
Range(Cells(1, ...続きを読む

QPL/SQL内の共通関数の引数にフェッチしたレコードごと渡すのは可能?

カーソルでレコードを検索し、フェッチします。
その後、INSERTする共通関数を呼ぶのですが、
フェッチしたレコードの値でINSERTしたいのです。
引数で1コずつ渡すと数が多いので、フェッチしたレコードごと引数で渡せないかと
それって可能ですか?

Aベストアンサー

こんにちは。

 共通関数の引数にカーソルのレコード型(cursor_name%ROWTYPE)を
使用すればよいと思います。
ただこの場合は、汎用性に乏しいのですが・・・。

 よって個人的にはINSERT先のテーブル名のレコード型が
お勧めです。[テーブル名%ROWTYPE]
 カーソルのレコードから移し変える処理が必要になりますが、
登録処理が簡単に記述できますネ。
(INSERT INTO TAL_NAME VALUE record_type;)

QEXCEL VBA 指定範囲内で特定の列に空白セルを含む行を非表示

初めて質問します。
A列に日付、B~H列にデータが入っています。
A列の日付が本日までの範囲で(明日以降の空行はそのまま残して)、B列に空白がある行だけ非表示にしたいのですが、何かいい方法はないでしょうか?

Aベストアンサー

こんばんは。

'標準モジュールが良いです。

Sub Test1()
  Dim myDate As Long
  Dim i As Variant
  myDate = Date
  i = Application.Match(myDate, Range("A:A"), 0)
  If IsError(i) Then
    MsgBox "本日の" & Format$(myDate, "yy/MM/dd") & "が見つかりません。", 48
    Exit Sub
  End If
  On Error Resume Next
  'B列に対して(かならず、1行目から行うこと)
  With Range("B1").Resize(i).SpecialCells(xlCellTypeBlanks)
   If Err.Number > 0 Then
    MsgBox "非表示にすべきセルが見つかりません!", 48
    Exit Sub
   Else
   .EntireRow.Hidden = True  'True 非表示
   MsgBox .Cells.Count & "行が非表示になっています。", 64
   End If
  End With
  On Error GoTo 0
End Sub

メッセージ等が不必要でしたら、その部分は削除してください。

こんばんは。

'標準モジュールが良いです。

Sub Test1()
  Dim myDate As Long
  Dim i As Variant
  myDate = Date
  i = Application.Match(myDate, Range("A:A"), 0)
  If IsError(i) Then
    MsgBox "本日の" & Format$(myDate, "yy/MM/dd") & "が見つかりません。", 48
    Exit Sub
  End If
  On Error Resume Next
  'B列に対して(かならず、1行目から行うこと)
  With Range("B1").Resize(i).SpecialCells(xlCellTypeBlanks)
   If Err.Number > 0 Th...続きを読む

Qデータハザードについて(パイプライン)

こんにちは。コンピューターアーキテクチャのパイプラインの項目の勉強をしていて、データハザードについて分からない問題があったので、質問させていただきます。

以下の二つのパイプラインの動作がよくわかりません。


基本的にはフォワーディングによって解決するデータハザードですが、メモリアドレス生成のときはフォワーディングは間に合わないので、結果の格納(W)が終わらないと命令フェッチ(F)ができないそうです。つまり
add r1, r2 .r3    F D E W
lw r4, dpl(r1)         F X X DEW

となるそうです。しかし
ld r2, c(r1)
subi r1, r1, 4
のように「ロード命令の次に算術命令」という順番ですと、ハザードは生じないそうです。


下の場合は上と違いr1のデータを更新するだけなのでフォワーディングによって改善ができるという解釈でよろしいのでしょうか?
上は本に書いてあったものなのですが、下のはインターネットから調べたものなのであっていない可能性があるので質問しました。

ちなみに両者ともロード命令の場合なのですが、ストア命令でも同じような振る舞いになるのでしょうか?

よろしくお願いいたします。

こんにちは。コンピューターアーキテクチャのパイプラインの項目の勉強をしていて、データハザードについて分からない問題があったので、質問させていただきます。

以下の二つのパイプラインの動作がよくわかりません。


基本的にはフォワーディングによって解決するデータハザードですが、メモリアドレス生成のときはフォワーディングは間に合わないので、結果の格納(W)が終わらないと命令フェッチ(F)ができないそうです。つまり
add r1, r2 .r3    F D E W
lw ...続きを読む

Aベストアンサー

「データハザード」ってのは, 端的にいうと「ある命令で得られた結果をそのあとの命令で使うために, 前の命令が終わるまで『あとの命令』の実行を止めなきゃならない」って状態.

ここに挙がっている例だと, 上のやつは add で得られた r1 を次の lw で使うから, 「r1 が得られるまで lw を実行できない」ということになる. ところが下の場合には ld の結果である r2 はそのあとで使わないから, ここで見えている分についてはハザードは生じていない (さらにあとの命令で r2 を使っていたら, ld とのタイミングでハザードが起きるかもしれん). あるいは,
ld r1, c(r2)
subi r1, r1, 4
なら明らかにハザードが起きる.

そして, はっきりいうと「ロードの場合はメモリからレジスタにデータを移すので算術命令のデータがメモリに書き込まれるまではストールしてしまう」というのは何をいっているのかよくわからん. もっというと「算術命令のデータがメモリに書き込まれる」とか「算術命令がメモリにデータを書き込む」とかの意味がわからん. どういうこと? どうせ MIPS かなんかの RISC なんだろうから, そもそも「算術命令の結果」がメモリに書き込まれることはありえないよ.

それぞれの命令を実行するために「確定していなければならないデータ」がなんなのか, そしてそれらが「どのタイミングで確定するのか」を確認してください. ここの例だと「add の結果がどこで出てきてどのタイミングにフォワーディングできるのか」とか「メモリアドレスをどのタイミングで生成するのか」とか, です.

とはいえ, 上の例で「どのステージが同時に起きているのか」がわからないんだよね.... add の D と lw の F が同じクロックと思っていい?

参考URL:http://akademeia.info/index.php?%A5%D1%A5%A4%A5%D7%A5%E9%A5%A4%A5%F3%A5%CF%A5%B6%A1%BC%A5%C9

「データハザード」ってのは, 端的にいうと「ある命令で得られた結果をそのあとの命令で使うために, 前の命令が終わるまで『あとの命令』の実行を止めなきゃならない」って状態.

ここに挙がっている例だと, 上のやつは add で得られた r1 を次の lw で使うから, 「r1 が得られるまで lw を実行できない」ということになる. ところが下の場合には ld の結果である r2 はそのあとで使わないから, ここで見えている分についてはハザードは生じていない (さらにあとの命令で r2 を使っていたら, ld とのタイミングで...続きを読む

Q【Excel】特定の文字を含むセルをカウントしない方法

エクセルで特定の文字列(仮に「key」とします)を"含む"場合の関数は、

=COUNTIF(A1..A20,"*key)

で処理できるのは分かっているのですが、

特定文字列(key)を"含まない"場合の処理方法が分かりません。
VBAなどを介さずに関数だけで処理する方法がありましたら、ご教示願います。

Aベストアンサー

=COUNTIF(A1:A20,"<>*key*")
でできませんか?

Q「スーパーフェッチ」と「プリフェッチ」の違い

Vistaで「スーパーフェッチ」機能とはよく使用するアプリケーションをメモリにプリロードするとありますが、XPの「プリフェッチ」機能にも似たような記載がありました。
この両者の機能で決定的な違いは何処でしょうか?
ご存知あれば教えて頂ければ幸いです。

Aベストアンサー

どのデータをプリロードするかを選択する戦略が賢くなったということです.

XPでは単に最も最近使ったデータを優先的に選んでいましたが,Vistaでは今までの履歴を学習してより最適な(次に必要になりそうな)データを選ぶようになりました.

参考URL:http://pc.watch.impress.co.jp/docs/2007/0226/mobile366.htm

QExcelで任意の文字を含むセルの1つ下のセルを文字カウント

関数初心者です。
Excelで任意の文字を含むセルの1つ下のセルを文字カウントする、シンプルでスマートな方法はないでしょうか?

具体的には
     A列
1行目 @: インデックス1
2行目 この行の文字数をカウント
3行目 <空白行>
4行目 @: インデックス2
5行目 この行の文字数をカウント

上記のようなケースで「@:」を含むセルの1つ下の行(2,5行目の文字数をカウントしたいのです。

現状では、以下のような不細工な方法でやっています:

A列の左隣に列を3つ挿入し(オリジナルのA列がD列になります)、C1に「=FIND("@:", D1)」とした上で関数を最終行までコピー→この例では1,3行目に「1」と表示されます

次にB2に「=IF(C1=1,"TRUE","")」と入力し、これを最終行までコピー→この例では2,5行目に「TRUE」と表示されます

最後にB列にオートフィルタをかけ、TRUEの行だけ表示したうえで、A1に「=LEN(A1)」と入力して、これを最終行までコピーしています→これで、2,5行目の文字数がカウントされます

こんなヘタクソな方法ではなく、1つの関数で綺麗に同じ結果を得る方法はないでしょうか?

もっと勉強すれば、自分でも出来るかもしれませんが、今すぐ必要なのでどうかご教示ください。

関数初心者です。
Excelで任意の文字を含むセルの1つ下のセルを文字カウントする、シンプルでスマートな方法はないでしょうか?

具体的には
     A列
1行目 @: インデックス1
2行目 この行の文字数をカウント
3行目 <空白行>
4行目 @: インデックス2
5行目 この行の文字数をカウント

上記のようなケースで「@:」を含むセルの1つ下の行(2,5行目の文字数をカウントしたいのです。

現状では、以下のような不細工な方法でやっています:

A列の左隣に列を3つ挿入し(オリジ...続きを読む

Aベストアンサー

質問文との表記の都合で、B列に結果を求めるとします。

B1に
 =IF(ISERROR(FIND("@:",A1)),"",LEN(A2))
として、下にコピーフィルではいかがでしょうか?

ついでに検索する「@:」もいろいろ変わることを想定するならば、検索対象をどこかのセル(ここでは仮にC1としておきます)に記入するものとして、
B1に
 =IF(OR($C$1="",ISERROR(FIND($C$1,A1))),"",LEN(A2))
として、下にフィルコピーしておいて…
C1に「@:」あるいは、「@@」などと入力することによって、その内容を検索対象とした際の結果がB列に表示されるようになります。


人気Q&Aランキング

おすすめ情報