vbaでfor nextを使って計算しています。
excelのシートの値を使って計算しています。
for nextが3重になっていて中のyとxのfor next が計算し終わったらjのfor nextで次のセルを参照したいのですがうまくいきません。
どうしたらいいか教えてください。

コードは以下の通りです

For j = 1 To 2 Step 1
For y = 3 To 90 Step 3
γ = y / 180 * π
For x = -180 To 180 Step 6
α = x / 180 * π

γs = Range("A:A").Rows(j).Value / 180 * π
αs = Range("B:B").Rows(j).Value / 180 * π
Eeg = Range("C:C").Rows(j).Value
Eed = Range("D:D").Rows(j).Value


計算式(省略)

Next x

Next y

Next j

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

A 回答 (1件)

For y = 3 To 90 Step 3


γ = y / 180 * π
For x = -180 To 180 Step 6
α = x / 180 * π

For j = 1 To 2
 γs = cells(j, "A").Value / 180 * π
 αs = cells(j, "B").Value / 180 * π
 Eeg = cells(j, "C").Value
 Eed = cells(j, "D").Value
 '計算式(省略)
Next j

Next x
Next y

の順番という事かなと。
    • good
    • 0

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

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

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

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

QVBAで、アクティブなBOOKのファイル名を取得し

エクセルのVBAを使用して、選択されている、BOOKのファイル名を取得し、下記のように編集してA1セルに入れたいのですが、可能でしょうか?


BOOKのファイル名が「大阪_たこ焼き_1234.xls」の場合

大阪_と.xlsをは省いて、「たこ焼き_1234」がA1セルに入るようにしたい。

Aベストアンサー

拡張子なんでもござれ!
Sub TheBody()
Const xSeparator = "_"
Const xPeriod = "."
Dim KitCut As Variant
KitCut = Split(ActiveWorkbook.Name, xPeriod)
KitCut = Split(KitCut(0), xSeparator)
Range("A1").Value = KitCut(1) & xSeparator & KitCut(2)
Columns("A").AutoFit
End Sub

QEXCEL VBA の For・・・Next 小数のときに動きがおかし

EXCEL VBA の For・・・Next 小数のときに動きがおかしい。

<例>
 Sub テスト()
  Dim i As Single
  Dim j As Long

  For i = 0.025 To 0.03 Step 0.0025
  j = j + 1
  Cells(1, j) = i
  Next i
 End Sub

上記コードを実行すると、セル(1,1)~(1,3) にそれぞれ 0.025、0.0275、0.03 が入るはずです。
しかし、0.03が入らないまま処理が終了します。
デバックすると、
Next i
で、iに0.03が設定されたら、
   j = j + 1
に戻らず、そのまま終わっています。

シートに表示された0.025、0.0275を数式バーで見るとそれぞれ
    0.025000000372529、0.0274999998509884
となっています。
同様にNext i で0.03が設定されたように見えて、実際は0.03よりも少しだけ大きな数値が入ったのでしょうか?(debug.printを使いイミディエイトウインドウに表示させても0.03でしたが)

期待どおりi=0.03でも処理を実行させるにはどうしたらいいのでしょうか?

よろしくお願いします。

EXCEL VBA の For・・・Next 小数のときに動きがおかしい。

<例>
 Sub テスト()
  Dim i As Single
  Dim j As Long

  For i = 0.025 To 0.03 Step 0.0025
  j = j + 1
  Cells(1, j) = i
  Next i
 End Sub

上記コードを実行すると、セル(1,1)~(1,3) にそれぞれ 0.025、0.0275、0.03 が入るはずです。
しかし、0.03が入らないまま処理が終了します。
デバックすると、
Next i
で、iに0.03が設定されたら、
   j = j + 1
に戻らず、そのまま終わっ...続きを読む

Aベストアンサー

そりゃそうです。Excelは2進演算しますから。その手のループには整数を使うのが「プログラマの常識」です。

ですので基本的には

 Sub テスト()
  Dim i As Single
  Dim j As Long

  For i = 250 To 200 Step 25
  j = j + 1
  Cells(1, j) = i / 10000
  Next i
 End Sub

こんな感じではないかと。

いずれにせよ「パラメータに小数を使う」のは避けないと、思わぬところでおかしなな動きをしますよ。

QExcelVBA:自己のBook名を取得したい

WindowsXP-Proです。
Excelヴァージョンは2003です。

ExcelVBAでコーディングしています。
で、自分自身(つまり、このVBAコードを記述しているExcel本体)のBook名を取得したいのですが、何か関数は用意されていますでしょうか?

自分自身のBook名を取得したい理由は、VBAコードを記述しているExcel本体のファイル名(Book名)の名前が変更されても、VBAが正常に機能するように、今現在のBook名を取得したいのです。

複数のExcelファイルを、このVBAで操作しているため、
Workbooks("本体のBook名").Activate
を用いており、仮にファイル名(本体のBook名)の名前が変更されても、VBAが正常に機能できるように、"本体のBook名"部分を固定ではなく、可変で持てるようにしたいからです。

Aベストアンサー

Public Sub Auto_Open()
  MsgBox ActiveWorkbook.Name
  MsgBox ThisWorkbook.Name
End Sub

Private Sub Workbook_Open()
  MsgBox Me.Name
End Sub

いずれも、ブック名が表示されました。

QExcel VBAの「FOR~NEXT関数」について

VBAを初めて2ヶ月の超初心者です。

シートが2枚あり、sheet1は仕入金額一覧、sheet2は送付案内書になっています。VBAを利用して「sheet1から1行、sheet2へ転記し印刷後、次の行へ」と言う処理をしています。

Sub 送付案内()
Dim 行番号 As Integer
For 行番号 = 5 To 298
If Cells(行番号, 15).Value = 1 Then
Range(Cells(行番号, 2), Cells(行番号,12).Select
Selection.Copy
Sheets("送付案内").Select
Range(Cells(60, 1), Cells(60, 11)).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Worksheets("送付案内").PrintOut
Sheets("作業").Select
End If
Next
End Sub
Sub 仕入先名()
Dim 行番号 As Integer
For 行番号 = 5 To 298
Sheets("作業").Cells(行番号, 2) = WorksheetFunction.VLookup(Cells(行番号, 1), Sheets("仕入先マスタ"). _
Range("$A$3:$B$1135"), 2, False)
Next
End Sub

これでVBAを実行した場合、仕入金額一覧の並び順と微妙(2~3点)に異なる順番で印刷されました。仕入先名や仕入金額に間違いはありませんでした。

同様の経験のある方等、原因がわかる方がいらしたら、教えてください。よろしくお願いします。

VBAを初めて2ヶ月の超初心者です。

シートが2枚あり、sheet1は仕入金額一覧、sheet2は送付案内書になっています。VBAを利用して「sheet1から1行、sheet2へ転記し印刷後、次の行へ」と言う処理をしています。

Sub 送付案内()
Dim 行番号 As Integer
For 行番号 = 5 To 298
If Cells(行番号, 15).Value = 1 Then
Range(Cells(行番号, 2), Cells(行番号,12).Select
Selection.Copy
Sheets("送付案内").Select
Ran...続きを読む

Aベストアンサー

VBAの問題ではなくて、プリンタの設定の問題ということはないでしょうか。

スプールされる順番と印刷される順番が異なる
http://support.microsoft.com/kb/891594/ja

ドキュメントを確実に順番通り印刷するためには

・「全ページ分のデータをスプールしてから 印刷データをプリンタに送る」
・「スプールされたドキュメントを最初に印刷する」
を ON に設定します。

Q他のワークシート名の取得方法 (VBAを使用せずに)

VBAを用いずに、ワークシート関数のみでワークシート名を取得できないか探しています。

自分のシート名は、以下の出力結果の一部より取得することができました。
=CELL("filename")

しかし、他のシート名を取得する方法が思いもつきません。

VBAを用いずにシート名を取得することはできないのでしょうか?

Aベストアンサー

Excel2000でしたら、
1.[挿入]-[名前]-[定義] から、名前を2つ定義します。
  ・名前:PPP  参照範囲:=GET.WORKBOOK(1)
  ・名前:QQQ  参照範囲:=GET.DOCUMENT(88)
2.A1 に =SUBSTITUTE(INDEX(PPP,ROW()),"["&QQQ&"]","") と入力します。
3.A1 を下方にドラッグコピーすると、シート名が一覧で表示されます。

例えば3枚目のシート名のみを取得する場合は、任意のセルに
=SUBSTITUTE(INDEX(PPP,3),"["&QQQ&"]","") と入力します。

※マクロ関数というものですが、最近のバージョンにこれが付帯されているのかどうか
  わかりませんが。   ^_^;

Q【VBA】For Nextなどを使わないコード

こちらの識者の方々にはいつもお世話になっております。
VBAの質問です。

約40000行30列のデータがあるブックが20個あり、処理を毎日やるのですが、
処理自体はとても単純なものの、いかんせんデータ量が膨大で
マクロの時間がかかりすぎてしまいます。
現在は下記のようなコードになっています。

Sub test()

Dim lRow As Long
Dim f As Long

Application.ScreenUpdating = 0

Sheets(1).Activate
lRow = Cells(Rows.Count, 1).End(xlUp).Row
For f = lRow To 2 Step -1
If Cells(f, 4) = Empty Or Cells(f, 3) = "aa" Then
Cells(f, 4).EntireRow.Delete
Else
Cells(f, 2) = Mid$(Cells(f, 1), 4, 2)
Cells(f, 3) = Format(Application.VLookup(Cells(f, 3), Sheets(2).Range("A2:C8"), 2, 0), "00")
Cells(f, 4) = IIf(Left$(Cells(f, 4), 1) = "Z", Cells(f, 5), Cells(f, 4))
Cells(f, 7) = Format(Cells(f, 7), "yyyy/mm/dd")
Cells(f, 11) = Cells(f, 2) & Cells(f, 3)
Cells(f, 12) = Cells(f, 7)
End If
Next f

Application.ScreenUpdating = 1
MsgBox "done"
End sub

最初の行削除についてはオートフィルタで処理するとして、for NextやFor Eachなどの1行ずつ処理するコードを使わず、一気に処理することはできないのでしょうか?
せめて
Cells(f, 11) = Cells(f, 2) & Cells(f, 3)
ぐらいは
Range("K2:K40000") = Range("B2:B40000") & Range("C2:C40000")
みたいな記述ができないものかなぁと思っています。
このようなことは可能でしょうか?

こちらの識者の方々にはいつもお世話になっております。
VBAの質問です。

約40000行30列のデータがあるブックが20個あり、処理を毎日やるのですが、
処理自体はとても単純なものの、いかんせんデータ量が膨大で
マクロの時間がかかりすぎてしまいます。
現在は下記のようなコードになっています。

Sub test()

Dim lRow As Long
Dim f As Long

Application.ScreenUpdating = 0

Sheets(1).Activate
lRow = Cells(Rows.Count, 1).End(xlUp).Row
For f = lRow To 2 Step -1
If Cells(f, 4) = Empty O...続きを読む

Aベストアンサー

#5、cjです。

お礼欄でお尋ねの件ですが、
・私の想定と異なる部分で不適切な設計(エラーの原因)になっていた為、
 ご質問のコード部分は書き換えることになりました。
・配列変数の宣言、定義、については、
 正しく基本を理解して貰えるような "教授" は、
 この場では(物理的に)無理と判断しました。
以上の理由で直接お応えすること遠慮します。
代りに、新たな設計のコードを説明コメント付きで提示することで、
お求めの "教示" に対して参考になっていれば幸いです。

基本事項については、
【vba 配列変数】
【vba 配列変数の定義】
【vba 配列変数 再定義】
などのWeb検索で、学習ベースの解説が閲覧できると思います。

【vba scripting.dictionary】
連想配列についても調べてみてください。
# 多少応用的な書き方をしているので少し解説 #
基本的には辞書に登録しておいて、答えを調べるような使い方をします。
 Set oDict = CreateObject("Scripting.Dictionary")
 oDict("abc") = 19
 oDict("def") = 82
以上の登録によって、
 Key:"abc" に対応する Item:19
 Key:"def" に対応する Item:82
と設定され、
 MsgBox oDict("abc")  ' → 19
 MsgBox oDict("abc")  ' → 82
のようにKeyに関連付けられたItenを高速に呼び出すことが出来ます。
今回はVLOOKUPの代りに用いています。


Sub mRe8260540d()

  Dim mtxS As Variant  ' セル範囲(行 * 列)を二次元配列(変数:行 * 列)に採り込む変数
  Dim mtxP As Variant  ' 二次元配列(変数:行 * 列)をセル範囲(行 * 列)に吐き出す変数
  Dim oDict As Object  ' Scripting.Dictionary 検索値に対応した値を取り出し易くする連想配列
  Dim rngT As Range  ' 作業セル範囲 並べ替えの基準となる値を出力して処理後に消去
  Dim tnRow As Long  ' 行数(=A列の最下行位置)を取得
  Dim tnCol As Long  ' 作業セル範囲の列位置(=使用中のセル範囲の列数+1)を取得
  Dim i As Long  ' ループ用

  With Application
    ' ' 描画更新を中止
    .ScreenUpdating = False
    ' ' イベント発効を中止
    .EnableEvents = False
    ' ' 数式の自動計算を中止
    .Calculation = xlCalculationManual
  End With

  With Sheets("Sheet1")  ' ◆要指定◆ シート名

'    .Select  ' 選択する必要はない(してもいい)

' ' ●●● 不要行削除 ●●●
    ' ' 行数(=A列の最下行位置)を取得
    tnRow = .Cells(Rows.Count, 1).End(xlUp).Row
    ' ' C:D列(行数分)の値を配列変数に採り込む
    mtxS = .Range("C1:D" & tnRow).Value
    ' ' 作業セル範囲に出力する配列変数のサイズを再定義並べ替えの基準となる値をして処理後に消去
    ReDim mtxP(1 To tnRow, 1 To 1) As Variant
    ' ' 2行め から 行数 までループ
    For i = 2 To tnRow
      ' ' 作業セル範囲に出力する 並べ替えの基準となる値の 二次元配列を 設定
        ' ' 「C列の値が"aa"」または「D列の値が空」ならば True、それ以外は False
      mtxP(i, 1) = mtxS(i, 1) = "aa" Or mtxS(i, 2) = ""
    Next i

    ' ' 作業セル範囲の列位置(=使用中のセル範囲の列数+1)を取得
    tnCol = .UsedRange.Columns.Count + 1
    ' ' 作業セル範囲をオブジェクト(Range型)変数に確保
    Set rngT = .Columns(tnCol).Resize(tnRow).Cells
    ' ' 作業セル範囲に 並べ替えの基準となる値の 二次元配列を 出力
    rngT.Value = mtxP
    ' ' 作業セル範囲を基準に 表全体を 昇順で 並べ替え
      ' ' →先頭行(2行め)以下:上層は False、最下行より上:下層は True
    .Cells.Resize(tnRow, tnCol).Sort Key1:=rngT(1), Order1:=xlAscending, Header:=xlYes
    ' ' 作業セル範囲の2行め以下、値が2行め(False)と異なる(Trueの)セル範囲を取得して
      '’行ごと、クリア
    rngT.Offset(1).ColumnDifferences(rngT(2)).EntireRow.Clear ' .ClearContents
    ' ' 作業セル範囲の値を(不要になったので)消去
    rngT.ClearContents
    '’YsedRangeを更新して、Ctrl+Endなどの一般機能を正しく動作するように修正。
    .UsedRange

' ' ●●● 連想配列作成 ●●●
    ' ' Sheet2!A2:B8 の値を配列変数に採り込む
    mtxS = Sheets("Sheet2").Range("A2:B8").Value
    ' ' Scripting.Dictionary への参照を作成しオベジェクト型変数に格納
    Set oDict = CreateObject("Scripting.Dictionary")
    ' ' Sheet2!A列を Key、Sheet2!B列を Format$関数に掛けて Item に 設定
    For i = 1 To 7  ' UBound(mtxS)
      oDict(mtxS(i, 1)) = Format$(mtxS(i, 2), "'00")
    Next i

' ' ●●● セル範囲(表全体)を二次元配列変数に採り込む ●●●
    ' ' 不要行削除後の、行数(=A列の最下行位置)を取得
    tnRow = .Cells(Rows.Count, 1).End(xlUp).Row
    ' ' A:L列(行数分)の値を配列変数に採り込む
    mtxS = Range("A1:L" & tnRow).Value

' ' ●●● 配列変数の中身(要素)を書き換える ●●●
    ' ' 2行め から 行数 までループ
    For i = 2 To tnRow
      ' ' 2列め ← 1列め
      mtxS(i, 2) = Mid$(mtxS(i, 1), 4, 2)
      ' ' 3列め ← 3列め
      mtxS(i, 3) = oDict(mtxS(i, 3))
      ' ' 4列め ← 4列め
      mtxS(i, 4) = IIf(Left$(mtxS(i, 4), 1) = "Z", mtxS(i, 5), mtxS(i, 4))
      ' ' ← 7列め(日付) に対しては何もしません
      ' ' 11列め ← 2列め & 3列め( '00 形式でフォーマット済)
      mtxS(i, 11) = mtxS(i, 2) & Mid$(mtxS(i, 3), 2)
      ' ' 12列め = 7列め
      mtxS(i, 12) = mtxS(i, 7)
    Next i

' ' ●●● セル範囲の表示形式 設定 ●●●
    .Range("C2:C" & tnRow).NumberFormatLocal = "@"
    .Range("(G:G,L:L) 2:" & tnRow).NumberFormatLocal = "yyyy/mm/dd"

' ' ●●● 配列変数の値をまるごとセル範囲に出力 ●●●
    .Range("A1:L" & tnRow).Value = mtxS

  End With

  With Application
    ' ' 描画更新を再開
    .ScreenUpdating = True
    ' ' イベント発効を再開
    .EnableEvents = True
    ' ' 数式の自動計算を再開
    .Calculation = xlCalculationAutomatic
  End With

    ' ' 不要になったオブジェクト変数を 解放
  Set rngT = Nothing:  Set oDict = Nothing

  MsgBox "done"
End Sub

参考URL:https://www.google.co.jp/search?q=vba+scripting.dictionary

#5、cjです。

お礼欄でお尋ねの件ですが、
・私の想定と異なる部分で不適切な設計(エラーの原因)になっていた為、
 ご質問のコード部分は書き換えることになりました。
・配列変数の宣言、定義、については、
 正しく基本を理解して貰えるような "教授" は、
 この場では(物理的に)無理と判断しました。
以上の理由で直接お応えすること遠慮します。
代りに、新たな設計のコードを説明コメント付きで提示することで、
お求めの "教示" に対して参考になっていれば幸いです。

基本事項については、
【...続きを読む

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QFor Next ステートメントで計算式を代入したいのですが・・・

For Next ステートメントで計算式を代入したいのですが・・・

excel(2003) VBAでの質問です。
20行ごとに同じような表が20個つづいてあります(さらにそれが複数のシートにある形です)。
それぞれの特定のセルに、計算式を入れていきたいのですが、
現状こんな感じです。

For i = 18 To 400 Step 20

Cells(i, 6).Formula = "=IF(P6>'sheet2'!g18,g1,'sheet2'!f18)"

Next i

ここで、「=」の右側の計算式の部分のセル「P6」「g18」「g1」「f18」も、変数「i」の値に応じる形で20行ずつさげたいのですが、どうしたらいいのでしょうか?

 ちなみに、イメージではこんな感じなのですが

  Cells(i, 6).Formula = "=IF(P6+i>'sheet2'!g18+i,g1+i,'sheet2'!f18+i)"

当然エラーが出てしまいます。「P6」の部分を「cells(i-12,16)」とかにしてみても無理でした。

初歩的な質問で申し訳ないのですが、ご教示の程、よろしくお願いいたします。

For Next ステートメントで計算式を代入したいのですが・・・

excel(2003) VBAでの質問です。
20行ごとに同じような表が20個つづいてあります(さらにそれが複数のシートにある形です)。
それぞれの特定のセルに、計算式を入れていきたいのですが、
現状こんな感じです。

For i = 18 To 400 Step 20

Cells(i, 6).Formula = "=IF(P6>'sheet2'!g18,g1,'sheet2'!f18)"

Next i

ここで、「=」の右側の計算式の部分のセル「P6」「g18」「g1」「f18」も、変数「i」の値に応じる形で20行ずつさ...続きを読む

Aベストアンサー

R1C1形式を上手に使ってみると,ご相談の「セルによって式の文字列を変える」必要が無くなります。

For i = 18 To 400 Step 20
Cells(i, 6).FormulaR1C1 = "=IF(R[-12]C[10]>Sheet2!RC[1],R[-17]C[1],Sheet2!RC)"
Next i

R1C1形式の式の記述は,先にセルに一度
F18:
=IF(P6>Sheet2!G18,G1,Sheet2!F18)
の式を入れておき,ツールメニューのオプションの全般でR1C1にチェックを入れると
=IF(R[-12]C[10]>Sheet2!RC[1],R[-17]C[1],Sheet2!RC)
のように自動で変わるので,そのまま数式バーの中からコピーして使えばOKです。


#別の手
目的のセルをまとめてUnionにしておき,一斉に一つの式を投入する手もあります
ワークシート上の操作では,目的のセルをコントロールキー+クリックで飛び飛びに選択しておき,一つ式を入れてコントロール+Enterで入力する操作に相当します。
でも今回は式の入力先セルが飛び飛びで沢山なので,対象セル範囲を確保するのに結局ループしないといけないため,こちらの方法はあまりメリットはありません。

R1C1形式を上手に使ってみると,ご相談の「セルによって式の文字列を変える」必要が無くなります。

For i = 18 To 400 Step 20
Cells(i, 6).FormulaR1C1 = "=IF(R[-12]C[10]>Sheet2!RC[1],R[-17]C[1],Sheet2!RC)"
Next i

R1C1形式の式の記述は,先にセルに一度
F18:
=IF(P6>Sheet2!G18,G1,Sheet2!F18)
の式を入れておき,ツールメニューのオプションの全般でR1C1にチェックを入れると
=IF(R[-12]C[10]>Sheet2!RC[1],R[-17]C[1],Sheet2!RC)
のように自動で変わるので,そのまま数式バーの中からコピー...続きを読む

QVBAでアカウント名を取得する方法

VBAで処理したEXCELブックをデスクトップに自動保存しようとしています。VBAで現在作業中のユーザーアカウント名を自動で取得する方法を教えていただきたいのですが。

デスクトップ上にブックを保存するには、パスを記述すればよいのですが、現在PC毎にユーザーアカウントを設定しユーザー名が異なっています。
このため、PC毎にこのユーザー名をデスクトップへのパスに入れ込まなければなりません。毎回キーボードからこのユーザー名を入力する方法もありますが、自動的にユーザー名を取得し、正しいパスを指定する方法を検討しています。
どなたか、VBAでこのユーザー名を取得する方法が有れば教えていただきたいのですが。
よろしくお願いいたします。

Aベストアンサー

Environ関数で、環境変数[USERNAME]を取得する。

MsgBox Environ("USERNAME")

QEXCEL VBAでADOを使ってEXCELファイルよりデータを取得し

EXCEL VBAでADOを使ってEXCELファイルよりデータを取得しています。
その際のSQL実行結果が上手くいきません。


'Excel のバージョン 2003 SP3

'データ項目名
'ID,名前,,,,,,,,,,,長文1,長文2,,,,削除フラグ,削除日時,更新日時 ←こんな感じで20項目

上記の「削除フラグ」の値を抽出条件にしています。
文字列の項目で、''、' '、'1'などの値があります。
'1'が入っているデータは削除された古いデータなので、抽出対象外にしたいです。

mySql = "select * FROM Sample1 WHERE (名前 LIKE '%山%') AND (削除フラグ <> '1')"
Set adoRS = adoCON.Execute(mySql)
Debug.Print mySql

上記を実行すると、対象データはあるのに取得できません。
実行時エラーになることはなく、処理は正常に終了します。

mySql = "select * FROM Sample1 WHERE (名前 LIKE '%山%') AND (削除フラグ = '1')"
だと、「削除フラグ」に'1'が入っているデータが取得できます。

mySql = "select * FROM Sample1 WHERE (名前 LIKE '%山%') AND (削除フラグ != '1')"
これを試しましたが、構文エラー:演算子がありません となります。


SQL文が悪いのか、「削除フラグ」のデータが悪いのかわかりません。

解決していただけなしでしょうか?

EXCEL VBAでADOを使ってEXCELファイルよりデータを取得しています。
その際のSQL実行結果が上手くいきません。


'Excel のバージョン 2003 SP3

'データ項目名
'ID,名前,,,,,,,,,,,長文1,長文2,,,,削除フラグ,削除日時,更新日時 ←こんな感じで20項目

上記の「削除フラグ」の値を抽出条件にしています。
文字列の項目で、''、' '、'1'などの値があります。
'1'が入っているデータは削除された古いデータなので、抽出対象外にしたいです。

mySql = "select * FROM Sample1 WHERE (名前 LIKE '%山%') AND (削...続きを読む

Aベストアンサー

こんにちは。

>上記を実行すると、対象データはあるのに取得できません。
取得できない対象データの削除フラグは、空のセルになっていると想像しました。

空のセルはNullという値になっています。
条件「削除フラグ <> '1'」は、真になりません。

>mySql = "select * FROM Sample1 WHERE (名前 LIKE '%山%') AND (削除フラグ <> '1')"
以下のようにすると、取得できなかった対象データも取得できると思います。
削除フラグの条件に OR 削除フラグ IS NULL を追加しています。
mySql = "select * FROM Sample1 WHERE (名前 LIKE '%山%') AND (削除フラグ <> '1' OR 削除フラグ IS NULL)"


確認に使ったサンプルプログラムを添付します。
確認に使ったサンプルデータを画像添付します。

Dim oConn As New ADODB.Connection
Dim adoRS As ADODB.Recordset
Dim mySql As String

'エクセルファイルに接続
With oConn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.Properties("Extended Properties").Value = "Excel 8.0"
.Open "E:\test\q6209009.html\test.xls"
End With

mySql = "select * FROM Sample1 WHERE (名前 LIKE '%山%') AND (削除フラグ <> '1' OR 削除フラグ IS NULL)"
Set adoRS = oConn.Execute(mySql)

Do Until adoRS.EOF
Debug.Print adoRS!名前; adoRS!削除フラグ
adoRS.MoveNext
Loop

'接続を閉じる
oConn.Close


はずれていたらごめんなさい。
よろしくお願いします。

こんにちは。

>上記を実行すると、対象データはあるのに取得できません。
取得できない対象データの削除フラグは、空のセルになっていると想像しました。

空のセルはNullという値になっています。
条件「削除フラグ <> '1'」は、真になりません。

>mySql = "select * FROM Sample1 WHERE (名前 LIKE '%山%') AND (削除フラグ <> '1')"
以下のようにすると、取得できなかった対象データも取得できると思います。
削除フラグの条件に OR 削除フラグ IS NULL を追加しています。
mySql = "select * FROM Sample1 W...続きを読む


人気Q&Aランキング