Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5739 / 13645 ツリー ←次へ | 前へ→

【49162】配列について教えてください 07/5/25(金) 17:37 質問[未読]
【49166】Re:配列について教えてください りん 07/5/25(金) 18:40 回答[未読]
【49167】Re:配列について教えてください 07/5/25(金) 19:31 お礼[未読]

【49162】配列について教えてください
質問    - 07/5/25(金) 17:37 -

引用なし
パスワード
   初心者です。配列変数を勉強しようとしたら、最初からつまづいてしまいました。
どなたか、配列につてご教授願います。

『やりたいこと』
句読点の入っている文章の、句読点間の文字数を取得する。

『教えてほしいこと』
下記コードで(A)(B)のMegboxで確認したところ、正しい値を取得していましたが、1.〜2.の文字数の計算値がうまくいきません。
どうも配列への値の格納方法が間違っているようなんですが、どうしたらいいのか分かりません。

(下記文章でテストしました)
東京、埼玉は雨。神奈川は曇り、山間部では

Option Explicit
Option Base 1

Sub 句読点()

Dim i As Integer, j As Integer
Dim k As String, 句読点 As Integer
Dim 文章 As Integer, 文字数() As Integer


文章 = Len(ActiveCell)

For j = 1 To 文章
  k = Mid(ActiveCell, j, 1)
  If k = "、" Or k = "。" Then
  句読点 = 句読点 + 1
  
  ReDim 文字数(句読点) As Integer
  
  文字数(句読点) = j
   
 ' MsgBox 句読点      ' (A)確認用・・句読点の個数
 ' MsgBox 文字数(句読点)   '(B)確認用・・文頭から句読点までの文字数
  End If
  
Next

' (C)再確認位置

MsgBox 文字数(1) - 1       '1.文頭から最初の句読点までの文字数・・・NG

For i = 2 To 句読点
MsgBox 文字数(i) - 文字数(i - 1) - 1 '2.句読点間の文字数・・・NG
Next

MsgBox 文章 - 文字数(句読点)   '3.最後の句読点から文末までの文字数・・・OK
                     '文字数(i)にしたらNG
End Sub

『結果と原因究明』
(A)と(B)で句読点の個数と、その位置が文頭から何文字目かを確認したところ
文字数(1)は3
文字数(2)は8
文字数(3)は15
で、正しい値を取得していました。

ところが、1.の計算結果は「−1」で、私が想定した「3−1=2」という結果が
得られません。2.も同じでした。そこで(C)の位置に

For i = 1 To 句読点
MsgBox 文字数(i)
Next

を入れて、文字数(i)の内容を確認したところ
結果は 0、0、15 で
想定した 3、8、15 は得られませんでした。
最初は、(A)(B)の値が正常だったので、配列からの値の取り出し方が間違っているのかと思ったんですが、
そもそも正しい値が配列に格納されていないことが分かりました。
ただ、これをどう修正したらいいのか、よく分かりません。
どなたか、ご教授願います。

【49166】Re:配列について教えてください
回答  りん E-MAIL  - 07/5/25(金) 18:40 -

引用なし
パスワード
   岳 さん、こんばんわ。

>どうも配列への値の格納方法が間違っているようなんですが、どうしたらいいのか分かりません。
格納方法はまちがっていませんが、


>Sub 句読点()
<<略>>
ReDim 文字数(1) As Integer 'これを宣言しておく

>For j = 1 To 文章
>  k = Mid(ActiveCell, j, 1)
>  If k = "、" Or k = "。" Then
>  句読点 = 句読点 + 1
>  
>  ReDim 文字数(句読点) As Integer
   ↑ここで配列を初期化してしまっているので、せっかく入ってる値が無くなっています。
<<以下略>>

配列の内容を保持したい場合は、
ReDim Preserve 文字数(句読点) As Integer

です。

↓参考
Sub test()
  ReDim dt1(1), dt2(1)
  '
  For II% = 1 To 3
   ReDim dt1(II%)
   ReDim Preserve dt2(II%)
   '同じものを入れる
   dt1(II%) = II%: dt2(II%) = II%
  Next
 
  For II% = 1 To 3
   MsgBox dt1(II%), vbInformation, dt2(II%)
  Next
End Sub

【49167】Re:配列について教えてください
お礼    - 07/5/25(金) 19:31 -

引用なし
パスワード
   ▼りん さん:
こんばんわ、前回に引き続いての「りんさん」からの回答。恐縮します。
有難うございます。
教えて頂いたコードに直したら、簡単に出来ました。

>配列の内容を保持したい場合は、
>ReDim Preserve 文字数(句読点) As Integer
>
RemDim Presrve というのは知りませんでした。
改めて手元の本で調べて見たんですが、載っていませんでした。
有難うございます。

質問では背景を説明しませんでしたが、Excelの文章を音声出力させています。
その時に、句読点の間があまりに長いと、息継ぎ無しの一気読みになるため
聞きずらくて、句読点の少ないない文章を修正する目安に使用したいと思い
質問したマクロを考えて見ました。
基本が出来たので、後の追加機能は多分大丈夫だと思います。

前回といい、今回といい、すばやい、分かりやすい回答
有難うございます。

5739 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free