■77743 / inTopicNo.8) |
Re[3]: Split関数の空データの判別って? |
□投稿者/ 魔界の仮面弁士 (566回)-(2015/11/19(Thu) 18:13:51)
|
■No77738 (たろう さん) に返信 > 例えば50個のセルに先頭から35個目までデータが入っていると、 > 途中に空のデータが入っていても35個目のデータまでは認識されます。 > カウントは35とされます。 その時、ペーストされた文字列に タブは何個含まれていましたか?
Dim strLine As String Dim ary() As String
Debug.Print "** 50列すべてにデータが入っている場合 **"
strLine = "" strLine = strLine & "01|02|03|04|05|06|07|08|09|10|" strLine = strLine & "11|12|13|14|15|16|17|18|19|20|" strLine = strLine & "21|22|23|24|25|26|27|28|29|30|" strLine = strLine & "31|32|33|34|35|36|37|38|39|40|" strLine = strLine & "41|42|43|44|45|46|47|48|49|50" strLine = Replace(strLine, "|", vbTab, 1, -1, vbBinaryCompare)
ary = Split(strLine, vbTab, -1, vbBinaryCompare) Debug.Print UBound(ary) - LBound(ary) + 1
Debug.Print "** 50列中、35列目までしかデータが無かった場合 **"
strLine = "" strLine = strLine & "01|02|03|04|05|06|07|08|09|10|" strLine = strLine & "11|12|13|14|15|16|17|18|19|20|" strLine = strLine & "21|22|23|24|25|26|27|28|29|30|" strLine = strLine & "31|32|33|34|35||||||" strLine = strLine & "|||||||||" strLine = Replace(strLine, "|", vbTab, 1, -1, vbBinaryCompare)
ary = Split(strLine, vbTab, -1, vbBinaryCompare) Debug.Print UBound(ary) - LBound(ary) + 1
> この関数が空のデータがTab区切りである時どう認識しているのかがわかりません。 そういうことでは無く、原因の特定のために、再現性を確立させましょう、という話です。
たとえば: strLine = タブ区切り文字列データ ary = Split(strLine, vbTab, -1, vbBinaryCompare) とした場合、strLine の内容がどういう文字列の場合に、 分割後の ary がどうなっているのか、関係性を調査しましょう、ということです。
そのためにも、実際に「50 個に分割されなかった時」に Split に渡していた文字列を、 前回の回答に書いた AscW で一文字ずつ精査してみてください。
現状は、実際の環境に触れているたろうさんしか調査できませんが、 具体的なデータが提供されれば、たろうさん以外の第三者でも検証できます。
その結果、予想と違う結果になるようであれば、Split の問題が疑われますし、 Split の動作に問題が無さそうなら、ペーストされたタブ区切り文字列データと、 Excel からコピーされてきた内容の差異ということになりますよね。
> 最後の行データが50個埋まっている場合には成功しますので。 了解です。
> テキストエディタに貼り付けるとCrLfになっていました。 > さくらエディタですと、\r\n の状態です。
今回のように、原因箇所を特定するためのケースでは、 クリップボードの内容をバイナリとして表示できるタイプの クリップボードビューワーで確認されることをお奨めします。 (今回、そこまでの調査が必要になるかどうかは別として)
何故バイナリ形式での取得をすすめるかと言うと、 クリップボードは通常、複数の形式でデータを保持しており (Unicodeテキスト、テキスト、OEMテキスト、リッチテキストなど)、 その中のどれがペーストされるかは、アプリケーションによって異なるためです。
また、アプリケーションによってはペースト時に改行や文字コードを 変換してしまうものもありますので(Visual Studio .NET など)、 正確な情報を知ろうとする場合には、バイナリレベルで調査できる ツールの方が、問題箇所を特定しやすくなります。
>>・『列データを複数行コピー』というのは、どういう操作を意味していますか? > 50個の列データを10行コピーする場合、A1からAX10までを選択しコピーしています。 コピーしたデータは、どのように取り出していますか?
・ユーザーが TextBox に貼り付け、その Value を読み取る ・VBA から acCmdPaste を通じて貼り付け、その Value を読み取る ・CF_TEXT を直接取り出す https://msdn.microsoft.com/ja-jp/library/office/ff194373.aspx
|
|