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

お世話になります。
下記のようにSQLで出力した内容を、WriteLineで書きだす際に
1行読む毎に、前の行と比較して、同じだったら空白にしたいです。

<前>
あああ AAA 0
あああ BBB 1
いいい AAA 0
いいい CCC 0
いいい CCC 2
ううう DDD 1


<後>
あああ   AAA  0
空白    BBB  1
いいい   AAA  0
空白    CCC  空白   
空白    空白   2
ううう   DDD  1

下記を実行していますが、3列目の数値部分が原因なのか
「型が一致していません」と出てしまいます。

必要な個所だけ載せます。
--------------------------------------------------------
1: For i = 1 To 3
2: testStr(i) = ts.Fields(i-1).Value
3: testStr2(i) = testStr(i)
4: if testStr(i) = testStr2(i) then
5: testStr(i) = ""
6: else
7: testStr2(i) = testStr(i)
8: end if
--------------------------------------------------------
  以降
testLine=testLine とtestStr(i)を結合して出力
Nextでループ

上記のi=3(3列目)になった時、3行目「testStr2(i) = tmpStr(i)」で比較した時に
「型が一致していません」エラーが出ます。
数値の場合は何か指定が違うでしょうか。

すみませんが、ご教授頂きたくよろしくお願いします。

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

  • 回答ありがとうございます。
    直接打ったため、所々記載ミスしてしまいました。

    不明箇所1)不明箇所2)
    まず、下記3行目は不要でした。
    3: testStr2(i) = testStr(i)
    tmpStr(i)も打ち間違いで、testStr(i)です。

    不明箇所3)
    下記で宣言しています。
    Dim testStr(3)
    Dim testStr2(3)
    回答ありがとうございます。
    直接打ったため、所々記載ミスしてしまいました。

    1: For i = 1 To 3
    2: testStr(i) = ts.Fields(i-1).Value
    3: if testStr(i) = testStr2(i) then
    4: testStr(i) = ""
    5: else
    6: testStr2(i) = testStr(i)
    7: end if
    8: Next

    No.1の回答に寄せられた補足コメントです。 補足日時:2017/03/21 18:29

A 回答 (5件)

#4 の


[#1の回答者です。] -> は、[#2....]の間違いです。
#1様、番号間違いすみません。

ともかく気になることだけが頭に残っていたもので、失礼しました。ふだん、VBSではやったことがありませんでしたので、勉強がてらやってみました。

以下の結果がこうなりました。
タブを入れましたが、見やすいように、全角空白が入っています。

あああ AAA 0
""   BBB 1
いいい AAA 0
""   CCC  ""
""   ""  2
ううう DDD 1

Dim objFS
Set objFS=CreateObject("Scripting.FileSystemObject")
Set objText =objFS.CreateTextFile(myPath & "\result.txt")
ReDim testStr(3)
ReDim teststr2(3)
For i=1 To 3  '←念のために入れました。
teststr2(i)=""
Next
With Ts
j = 1
.MoveFirst
Do Until .EOF =True
For i = 1 To 3
testStr(i) = .Fields(i - 1).Value
If testStr(i) = teststr2(i) Then
testStr(i) = """""" ←空白の代わりにしました。
Else
teststr2(i) = testStr(i)
End If
Next
objText.WriteLine(Mid(Join(Teststr, vbTab),2))
.MoveNext
j = j + 1
Loop
objText.Close
MsgBox "finish!"
End With
    • good
    • 0
この回答へのお礼

遅くなってすみません。
ご回答ありがとうございました!

皆様のおかげで色々試しながらも、理想の動作に持って行くことができました!
本当に助かりました。

お礼日時:2017/03/28 20:12

#1の回答者です。


>補足日時:2017/03/21 18:29

ロジックは分かっていないけれども、(^^;、できていますね。失礼しました。
ただ、今、気になって、VBSに移植してみたけれども、以下のコードでくだんのエラーは出ませんでしたね。どこが違うのでしょうか?
Empty と比較するからいけないのでしょうか。Empty は型の変換が利かなかったように思います。もし、それが問題なら、最初に事前に、「""」を入れておけばよいと思います。一回やれば、後は、この変数は使い回しだから、型が違うということはないと思います。


ReDim testStr(3)
ReDim teststr2(3)

With Ts
.MoveFirst
Do Until .EOF =True
For i = 1 To 3
testStr(i) = .Fields(i - 1).Value
If testStr(i) = teststr2(i) Then
testStr(i) = ""
Else
teststr2(i) = testStr(i)
End If
Next
WriteLine Join(testStr, " ")  '出力は試していません。
.MoveNext
Loop
    • good
    • 0
この回答へのお礼

遅くなってすみません。
ご回答ありがとうございました!

皆様のおかげで色々試しながらも、理想の動作に持って行くことができました!
本当に助かりました。

お礼日時:2017/03/28 20:12

>3行目「testStr2(i) = tmpStr(i)」で比較した時に


>「型が一致していません」エラーが出ます。

強引に文字列型にしてから比較してはいかがですか。

if CStr(testStr2(i)) = CStr(tmpStr(i)) then
・・・・
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
CStrを使う方法は試していなかったのでやってみます!
ありがとうございます!

お礼日時:2017/03/21 18:32

ややこしいですね。

(^^;
少しかんがえてみました。
本格的に、VBSに入れてはいないので、ミスが残っているかもしれません。

2次配列の変数にうつして処理しました。
エラーの原因はわかりませんが、もしかしたら変数は、同じものを利用しているのではないでしょうか。私なら、最初に適当に作っておいて、それで入れ出しします。
私のほうでは、ご希望どおりにはなりましたが、さて、
ReDim teststr(2, 200)
この最初の作り方にもよりますね。


ReDim teststr(2, 200)
i = 0: j = 0
With ts
.MoveFirst
Do
teststr(i, j) = .Fields(i)
i = i + 1
If i = .Fields.Count Then
.MoveNext
j = j + 1
i = 0
End If
Loop Until j >= .RecordCount
.Close
ReDim Preserve teststr(2, j - 1)
teststr2 = teststr
i = 0: j = 0
Base = teststr(j, i)
For j = 0 To UBound(teststr)
Do
i = i + 1
If Base = teststr(j, i) Then
teststr2(j, i) = ""
Else
Base = teststr(j, i)
End If
Loop Until i >= UBound(teststr, 2)
i = 0
Next
End With
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
二次元配列を使う方法、とても参考になります!
試してみたいと思います!

お礼日時:2017/03/21 18:32

提示されたソースが良くわかりません。



不明箇所1)
3行目は
3: testStr2(i) = testStr(i)
のはずだが
3行目「testStr2(i) = tmpStr(i)」
となっている。
tmpStr(i)がいきなりでてくる。

不明箇所2)
3: testStr2(i) = testStr(i)
4: if testStr(i) = testStr2(i) then
3行目を実行した後、
4行目を実行すれば、常に等しいので、必ず、5行目が実行されるかと。

不明箇所3)
testStrとtestStr2の宣言箇所が不明なのでなんとも言えないが、
testStr(0)とtestStr2(0)は使用していないのか。
testStr(3)は、配列の範囲内に入っているのか。
この回答への補足あり
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
直接打ったため、所々記載ミスしてしまいました。

不明箇所1)不明箇所2)
まず、下記3行目は不要でした。
3: testStr2(i) = testStr(i)
tmpStr(i)も打ち間違いで、testStr(i)です。

不明箇所3)
下記で宣言しています。
Dim testStr(3)
Dim testStr2(3)
回答ありがとうございます。
直接打ったため、所々記載ミスしてしまいました。

1: For i = 1 To 3
2: testStr(i) = ts.Fields(i-1).Value
3: if testStr(i) = testStr2(i) then
4: testStr(i) = ""
5: else
6: testStr2(i) = testStr(i)
7: end if
8: Next

お礼日時:2017/03/21 18:33

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