以下、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初心者ですので宜しくお願い致します。
No.3ベストアンサー
- 回答日時:
こんにちは
ご提示のものとは違う発想になってしまいますが、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セルから下方へ、順に記入するようにしてあります。
fujillinさん、 新たな構文でかつ簡潔なものを誠にありがとうございました。 こちらも試しに使用し問題なく動作しました。 spilit関数とLBound、UBoundの組み合わせで簡単に一次元配列が出来るのですね、大変勉強になりました。 また機会ありましたら宜しくお願い致します。
No.4
- 回答日時:
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 ': ; の両方も、区分けが可能にします。
配列については、今回は、そのままにしておきます。
WindFallerさん
詳細な説明、誠にありがとうございます。 回答No2で頂いた構文を使用し無事動作出来ました。 一点だけ、j=1でスタートするとA4セルでなくA5セルからデータ入力されるのでj=0に変更しました。 画面のチラツキ防止や、区切りデータ数の確認方法など大変参考になりました。 また機会ありましたら宜しくお願い致します。 るま
No.2
- 回答日時:
直さないといけない部分があります。
原因は、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
'//
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Excel(エクセル) VBA 特定の列に入っているテキストをコピペ 2 2023/06/14 11:24
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Excel(エクセル) 表示形式、文字列セル(列)に数式を入力するには マクロ 1 2022/09/18 10:53
- Visual Basic(VBA) 配列の勉強をしています。使用する変数の意味、検索条件の書き方が難しいです。 2 2022/09/15 14:06
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
同一セルに日時があるものを日...
-
Excelで指定した条件と一致する...
-
1年分のデータから特定の月分...
-
EXCELでCSVファイル保存すると...
-
COUNTIFの反対の関数はあるので...
-
ドロップダウンリストで空白の...
-
1つのセルにまとまっている情報...
-
エクセルで数字、文字列混在の...
-
【Excel】要素数が不定な場合の...
-
5つとびのセルの集計
-
【VBA】指定フォルダに格納中の...
-
Excelで連続データを行飛ばしで...
-
excel2013 vba 簡易な処理...
-
エクセル
-
EXCELで足し算できるのにSUM...
-
エクセルVBA オートフィルの最...
-
エクセルVBAで、複数セルのデー...
-
EXCELで年月日の表記から日付部...
-
決められた数字の組み合わせが...
-
セルの着色を認識する関数って...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
同一セルに日時があるものを日...
-
1年分のデータから特定の月分...
-
EXCELでCSVファイル保存すると...
-
Excelで指定した条件と一致する...
-
COUNTIFの反対の関数はあるので...
-
ドロップダウンリストで空白の...
-
1つのセルにまとまっている情報...
-
エクセルVBAで、複数セルのデー...
-
エクセルで数字、文字列混在の...
-
エクセルでセルを一括で右詰に...
-
OFFSET関数を使用した印刷範囲...
-
EXCELで年月日の表記から日付部...
-
EXCELで足し算できるのにSUM...
-
【VBA】指定フォルダに格納中の...
-
Excelで連続データを行飛ばしで...
-
複数のシートの日付データを、...
-
excelで平均差を出したい
-
webクエリのurlの変更方法
-
Excel 空白セルの掛け算で答え...
-
エクセルで特定の行を除いて計...
おすすめ情報