電子書籍の厳選無料作品が豊富!

以下、F10セルにあるtextデータ(データの区切り文字として;によるデータの連結テキストで8221文字、漢字による名前とローマ字のメルアドの集合)、このデータを切り取り、A列に順番に入力するためのものです。 
 これを実行すると、myStringLenは、8221なので変数iは、同じ8221となりますが、変数jは、360で止まってしまい、それ以降のデータが切り出しされない(本来は、381になるもの)。 構文はwebから流用しています。


Dim i, j,myStringLen  As  Integer
Dim  mySTR, myCHARA As  String


mySTR = ""

myStringLen = Len(Range("F10").Text) 'データの文字数を取得

j = 1

For i = 1 To myStringLen

myCHARA = Mid(Range("F10").Text, i, 1)

 Select Case Asc(myCHARA)

 Case 59 'ASCⅡコードにおいてセミコロン「;」は、59である

Range("F10").Offset(j - 7, -5).Value = mySTR 'A4セルから順々にA列へにコピーする

mySTR = ""

j = j + 1

 Case Else

mySTR = mySTR & myCHARA

 End Select

Next i

Range("F10").Offset(j - 7, -5).Value = mySTR

mySTR = ""


以上、VBA初心者ですので宜しくお願い致します。

A 回答 (4件)

こんにちは



ご提示のものとは違う発想になってしまいますが、No1様の方法が簡単だと思いますので…

Sub test()
 Dim str, i As Integer
 str = Split(Range("F10").Value, ";")

 For i = LBound(str) To UBound(str)
  Range("A4").Offset(i).Value = str(i)
 Next i
End Sub

※ A4セルから下方へ、順に記入するようにしてあります。
    • good
    • 1
この回答へのお礼

fujillinさん、 新たな構文でかつ簡潔なものを誠にありがとうございました。 こちらも試しに使用し問題なく動作しました。 spilit関数とLBound、UBoundの組み合わせで簡単に一次元配列が出来るのですね、大変勉強になりました。 また機会ありましたら宜しくお願い致します。

お礼日時:2018/05/24 22:29

No.2 の回答者です。



昨日は、よく調べてみませんでしたが、今、やっと思い出しました。

Excelの仕様で、セルが含むことができる合計文字数 「32,767 文字 」
だから、この限界値を越えることができません。
だから、区切りは、その範囲内でしか行うことしかできません。

また、
dif = Len(myText) - Len(Replace(myText, ";", "")) 'セミコロンの数
終了時に、dif +1の区切りの単語数と、実際の区切った数 i のカウンターとを比較すれば、
全部終えたかどうか、区切り残しがあるのか、分かるはずだと考えています。(まだ細く検証はしていません)

なお、Long型、Integer型の說明を触れておきます。
Int, Long, Single, Double の数値型には、数値は整数(小数部なし)と実数(小数部あり)に分かれます。整数は実数に比べて、使用するメモリ消費量も少なく演算速度も速いのはおわかりなるとは思います。OS が、32bitの場合、16bitのInteger型は内部で32bit変換しながらコードが実行されます。32bitのLong型はこのオーバーヘッド(一旦変更する)がない分、高速なのです。(参考:エクセルExcel大事典 VBAマクロデータ型)

Integer型は、上限が32,767までですので、今では、カウンターで上限が分からない時に、暴走を防ぐ目的で使うことが多いです。32,767ですので、あっという間に上限に届いてしまいます。

私は、今回、あえて、セルの値を、文字型変数に格納することを選びました。数値を入れても、文字型になります。テキストプロパティの場合は、これに加えて、日付は表示形式のまま、エラー値もエラーの文字のままに受け取ることが可能ですが、逆に、セルには表示限界があるので、それで、8221個の制限を加えることになるようです。限界値の数字そのものは知りませんでしたが。

ちなみに、文字型の変数のキャパシティは、2G (32 bit OS) あります。

なお、ご質問者さんのコードで、元の作者がいるとは思いますが、
 Select Case AscW(myChar)
 これは、「:」や VbLf なども想定しているので、Select方式で行ったものだと思います。
 区切りに、AscW 関数は、Unicode  を感知できるように考えました。
最近は、Unicode 区切り文字が出てきています。
 当面は、
 Case 58, 59 ': ; の両方も、区分けが可能にします。
配列については、今回は、そのままにしておきます。
    • good
    • 1
この回答へのお礼

WindFallerさん
 詳細な説明、誠にありがとうございます。 回答No2で頂いた構文を使用し無事動作出来ました。 一点だけ、j=1でスタートするとA4セルでなくA5セルからデータ入力されるのでj=0に変更しました。 画面のチラツキ防止や、区切りデータ数の確認方法など大変参考になりました。 また機会ありましたら宜しくお願い致します。 るま

お礼日時:2018/05/24 22:23

直さないといけない部分があります。


原因は、Textプロパティを意図的に使ったたからだと思われます。
8221というのは、文字長の限界値です。
変数は、Dim i, j,myStringLen  As Integer
myStringLen しか、Integer型になっていません。また、Integer型は遅くなるので、特別な時以外は使わないことです。

'//
Sub Test1()
Dim i As Long, j As Long, myStrLen As Long
Dim myStr As String, myChar As String
Dim myText As String
myText = Range("F10").Value
'Dim dif
'dif = Len(myText) - Len(Replace(myText, ";", "")) 'セミコロンの数を数える
Application.ScreenUpdating = False  '画面のチラツキを防ぐ
myStrLen = Len(myText) 'データの文字数を取得
j = 1
For i = 1 To myStrLen
 myChar = Mid(myText, i, 1)
 Select Case AscW(myChar)
  Case 59
  'A4セルから順々にA列へにコピーする
  Range("A4").Offset(j).Value = myStr
  myStr = ""
  j = j + 1
  Case Else
  myStr = myStr & myChar
 End Select
Next i
Range("A4").Offset(j).Value = myStr
Application.ScreenUpdating = True
End Sub
'//
    • good
    • 1

セミコロンが全角で入ってるとか……


Split関数なんてのもありますよ。
    • good
    • 1
この回答へのお礼

よろずやkinchanさん 迅速な回答、誠にありがとうございます。 split関数の具体例を回答No3で頂いたので理解出来ました。 また機会ありましたら宜しくお願い致します。 るま

お礼日時:2018/05/24 22:33

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