データベース検索 数式も対応させたい | |
---|---|
[195793] データベース検索 数式も対応させたい- ■親トピック/記事引用/メール受信=OFF■ □投稿者/ ハマナス -(2023/06/29(03:27)) □U R L/ こんばんは。 データベース検索システムを作成したのですが、 「DB」シートには列数 28 行数 100行の構成になっており 数式が入っている列があるので「型が一致しません」というエラーになります。 ご教授よろしくお願いいたします。 Sub DBSearch() Call kousin Call midashioff Dim rowNo As Long, colNo As Long Dim sStr As String Dim dataDB As Variant Dim i As Long, j As Long 'DBの取得 With Worksheets("DB") rowNo = .Cells(.Rows.Count, "B").End(xlUp).Row '行の最終行取得 colNo = .Cells(1, .Columns.Count).End(xlToLeft).Column '列の最終列取得 dataDB = .Range(.Cells(1, "A"), .Cells(rowNo, colNo)).Value 'DBの範囲取得 End With With Worksheets("検索") sStr = .Range("A2").Value '検索値のセルを取得 '検索結果の削除 rowNo = .Cells(.Rows.Count, "A").End(xlUp).Row If rowNo >= 4 Then .Range(.Rows(4), .Rows(rowNo)).Delete End If '項目名 With .Range(.Cells(4, "A"), .Cells(4, UBound(dataDB, 2))) .Value = dataDB .Interior.Color = RGB(0, 176, 80) End With '検索結果 rowNo = 4 For i = 2 To UBound(dataDB, 1) Dim memo As String: memo = "" For j = 1 To UBound(dataDB, 2) memo = memo & dataDB(i, j) ’←ここで止まります Next j If memo Like "*" & sStr & "*" Then rowNo = rowNo + 1 For j = 1 To UBound(dataDB, 2) .Cells(rowNo, j) = dataDB(i, j) Next j End If Next i '枠組み .Range(.Cells(4, "A"), .Cells(rowNo, UBound(dataDB, 2))) _ .Borders.LineStyle = xlContinuous End With '見出し固定 Call midashion End Sub Sub kousin() Worksheets(1).Range("A5").CurrentRegion.Offset(2, 0).Copy Worksheets("DB").Range("A2").PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False Worksheets("検索").Range("A2").Select End Sub Sub midashioff() Rows(5).Select ActiveWindow.FreezePanes = False End Sub Sub midashion() Rows(5).Select ActiveWindow.FreezePanes = True End Sub この記事にはVBAのコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[195794] Re[1]: データベース検索 数式も対応させたい- ■記事引用/メール受信=OFF■ □投稿者/ 半平太 -(2023/06/29(09:08)) □U R L/ > memo = memo & dataDB(i, j) ’←ここで止まります で、その時 dataDB(i, j)の値はどうなっているんですか? エラーなんですか? エラーだったとして、止まらせないでどう進展させたいのですか? |
[195795] Re[2]: データベース検索 数式も対応させたい- ■記事引用/メール受信=OFF■ □投稿者/ ヘンリー -(2023/06/29(09:19)) □U R L/ >数式が入っている列があるので「型が一致しません」というエラーになります。 「dataDB = .Range(.Cells(1, "A"), .Cells(rowNo, colNo)).Value」 となっているので、dataDBには、数式が入っていないはずですが… Valueプロパティについて調べてみて下さい。 例えば、A1セルに「=SUM(A2:A5)」と入れて Range("B1").Value = Range("A1").Value をVBAで実行すると、B1セルには数式は入りません。 「型が一致しません」という事は、 「dataDB」というバリアント型の変数の型が、 「dataDB(i, j)」という型になっていないのではないでしょうか。 VBEのローカルウインドウを見てみて下さい。 この記事にはVBAのコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[195796] Re[3]: データベース検索 数式も対応させたい- ■記事引用/メール受信=OFF■ □投稿者/ ヘンリー -(2023/06/29(11:56)) □U R L/ 大変失礼しました。 >「dataDB(i, j)」という型になっていないのではないでしょうか。 と書きましたが、 「dataDB(i, j)」の値が文字列型になっていないのではないでしょうか。 が正しい文書でした。 追記として、セルに数式を入れた場合、 数式の入っているセルのValueプロパティで取得できるのは、 数式の戻り値(返り値)です。 ※数式を取得する場合、「Formula」プロパティです。 この数式の戻り値が「文字型ではない」或いは「文字型にできない」 のであれば、文字列演算子の「&」を使うと、 「型が一致しません」というエラーが出る可能性があります。 |
[195798] Re[4]: データベース検索 数式も対応させたい- ■記事引用/メール受信=OFF■ □投稿者/ ハマナス -(2023/06/30(13:45)) □U R L/ 半平太さん、ありがとうございます。 > memo = memo & dataDB(i, j) ’←ここで止まります 黄色の反転になります。 止まらせないで、数式結果を表示させたいです。 ヘンリーさん、ありがとうございます。 >この数式の戻り値が「文字型ではない」或いは「文字型にできない」 >のであれば、文字列演算子の「&」を使うと、 >「型が一致しません」というエラーが出る可能性があります。 おっしゃる通り、数式の戻り値が認識できていない為 止まってしまうのだと思います。 |
[195800] Re[5]: データベース検索 数式も対応させたい- ■記事引用/メール受信=OFF■ □投稿者/ ヘンリー -(2023/06/30(14:47)) □U R L/ >おっしゃる通り、数式の戻り値が認識できていない為 認識できていないのは、ハマナス様ではないですか? 例えば、指定したセル(セル範囲の中の1つのセル)に、 「#DIV/0!」という値が表示されているところがある場合、 (この場合、コンピュータは戻り値を「#DIV/0!」と認識している 又Valueプロパティも「#DIV/0!」となる) 「#DIV/0!」という値は文字ではなく、エラー値です。 このエラー値を、無理やり文字型に変更しようとする(CStr)をすると、 "エラー 2007"という文字列になります。 ※「エラー 2007」をダブルクォーテーションにしてあるのは、 文字列という明確な意図があるからです。 文字型でない値(例えなエラー値)を文字列演算子「&」という 文字列結合命令を出しても 「型が一致しないので文字列結合できません」となります。 最近のVBAやExcelの本では、「変数と変数の型」について 掲載を省いているものが多いので、仕方がないことかもしれません。 昔はコンピュータ関係の本には、「変数と変数の型」が1番初めに 載っていたのですが。。。 しかしながら、コンピュータを扱うにあたって、「型」というのは、 切っても切り離せません。 例えば、以下の2つの式は 概念的にはどちらも正しいです。 1+1=2 1+1=11 但し、正確に書くなら、 1+1=2 "1"+"1"="11" となります。 1+1=2は数値演算 "1"+"1"="11"は文字列演算(VBAでは「"1" & "1"」のように書きます) この様に、明確に「文字」と「数値」を分けて コンピュータに指示するのが基本です。 理由は、コンピュータは全て「0」と「1」だけで動作するからです。 例えば数値の「1」は「00000001」であらわされ、 文字の"1"は「100000001」という様にあらわされる みたいな感じです。 ※便宜上「0」と「1」に例えていて、 ゼロとイチの組み合わせもでたらめですが、 厳密な説明は長くなるので省きます。 数式の戻り値(セルに表示されている値)は、 どんなもの(全て文字型)ですか? エラー値とか入っていませんか? |
[195804] Re[6]: データベース検索 数式も対応させたい- ■記事引用/メール受信=OFF■ □投稿者/ ハマナス -(2023/07/01(13:12)) □U R L/ ヘンリーさん、詳しく説明してくださり ありがとうございます。 頭の中で??だったのが、ぼんやり明かりが射してきたような 感じです。 >数式の戻り値(セルに表示されている値)は、 >どんなもの(全て文字型)ですか? >エラー値とか入っていませんか? #VALUE と表示されております。 |
[195805] Re[7]: データベース検索 数式も対応させたい- ■記事引用/メール受信=OFF■ □投稿者/ 半平太 -(2023/07/02(14:16)) □U R L/ こんな事かな? > memo = memo & dataDB(i, j) ’←ここで止まります ↓ If IsError(dataDB(i, j)) Then Select Case dataDB(i, j) Case CVErr(xlErrDiv0) memo = memo & "#DIV/0!" Case CVErr(xlErrNA) memo = memo & "#N/A" Case CVErr(xlErrName) memo = memo & "#NAME?" Case CVErr(xlErrNull) memo = memo & "#NULL!" Case CVErr(xlErrNum) memo = memo & "#NUM!" Case CVErr(xlErrRef) memo = memo & "#REF!" Case CVErr(xlErrValue) memo = memo & "#VALUE!" Case Else memo = memo & "This should never happen!!" End Select Else memo = memo & dataDB(i,j) End If |
[195806] Re[8]: データベース検索 数式も対応させたい- ■記事引用/メール受信=OFF■ □投稿者/ ヘンリー -(2023/07/03(11:31)) □U R L/ 追加の回答が遅れてすみません。 >#VALUE と表示されております。 という事は、コンピュータ(Excel)は、 数式又は、ワークシート関数の戻り値を 「#VALUE」と認識しているという事です。 そして、ワークシート関数の戻り値がエラーの時、 そしてエラーの種類によって文字列結合演算(&)で結合する文字列を 強制的に指定したコードが、半平太様のコードになります。 半平太様、フォローのコードありがとうございます。 |
[195807] Re[9]: データベース検索 数式も対応させたい- ■記事引用/メール受信=OFF■ □投稿者/ ハマナス -(2023/07/04(09:20)) □U R L/ 返信が遅くなり申し訳ありませんでした。 半平太さん、コードUPありがとうございました。 このコードは、どこに追記?入替? すれば宜しいでしょうか。 ヘンリーさん、説明ありがとうございました。 |
[195808] Re[10]: データベース検索 数式も対応させたい- ■記事引用/メール受信=OFF■ □投稿者/ 半平太 -(2023/07/04(10:28)) □U R L/ memo = memo & dataDB(i, j) ’←ここで止まります ↑ その1行と入替です。 まぁ、現実問題として、そんな沢山のケースを想定しないでもいいんでしょうが、 考え方が分かる様に、Microsoftのサンプルをそのまま利用しました。 |
[195810] Re[11]: データベース検索 数式も対応させたい- ■ / 記事引用/メール受信=OFF■ □投稿者/ ハマナス -(2023/07/04(14:37)) □U R L/ 半平太さん、ありがとうございました。 全部表示されました。 助かりました。 |
このトピックに書きこむ |
---|