VB 2008: Do While...Loop文について
- VB 2008のDo While...Loop文についての質問です。
- 質問者は、特定のファイルから文字を取得するための関数について説明しています。
- 質問者が悩んでいるのは、Do While...Loop文内のIf Else End Ifの扱いについてで、助言を求めています。
- ベストアンサー
VB 2008: Do Whie...Loop文について
Function FileGetChar(ByVal f As String, ByVal p As Integer) As String Dim i As Integer = 1 Dim j As Integer = 0 Dim l As Integer Dim n As Integer = FreeFile() Dim c As Char If File.Exists(f) Then FileOpen(n, f, OpenMode.Random, OpenAccess.Read, , 1) l = FileLen(f) Do While (i + j <= l) FileGet(n, c, i + j) j = j - (Math.Abs(Asc(c)) > 255) i = i + 1 If i > p Then Exit Do Else c = "" End If Loop FileClose(n) End If Return c End Function [イミディエイトウインドウ] ? FileGetChar("D:\Temp\Test.txt",1) "1" ? FileGetChar("D:\Temp\Test.txt",2) "2" と、一応は動作しています。 l------->ファイル長 i+j----->読み込みのカレントポジション p------->読み込み指示ポジション 今、悩んでいるのはDo...Loop文中のIf Else End If の追放。 何か妙手があれば教えて頂きたい。
- Visual Basic
- 回答数2
- ありがとう数3
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Do While (i + j <= l) And (i <= p) ... Loop ってことですか?
その他の回答 (1)
- D-Matsu
- ベストアンサー率45% (1080/2394)
あ、もひとつ。 > c = "" はFileGet()の前に移動してください。
お礼
Function FileGetChar4(ByVal f As String, ByVal p As Integer) As String Dim i As Integer = 1 Dim j As Integer = 0 Dim l As Integer Dim n As Integer = FreeFile() Dim c As Char If File.Exists(f) Then FileOpen(n, f, OpenMode.Random, OpenAccess.Read, , 1) l = FileLen(f) Do While (i + j <= l) And (i <= p) FileGet(n, c, i + j) j = j - (Math.Abs(Asc(c)) > 255) i = i + 1 Loop FileClose(n) End If Return IIf(p > i, "", c) End Function Do...Loop文の条件に問題があるとばっかり思い込んでいました。 要は、Return文で工夫すべき問題でした。 ともかく、回答を読んで再度テストする中で解決しました。 ありがとうございました。 これで、3、4時間も悪戦苦闘するとは我ながら情けない限りです。
関連するQ&A
- VB Shell sort
初心者です。 シェルソート後の数字がうまく表示できません。 見よう見まねでしているので、どこがどうおかしいのかわかりません。 大変、恐縮ですが宜しくお願いいたします。 ----------------------------------------- Public Class Form1 Dim intNumber() As Integer = {2, 6, 4, 8, 10, 12, 89, 45, 37} Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Display unsorted numbers to lists For i As Integer = 0 To 8 lstShell.Items.Add(intNumber(i)) Next End Sub Sub btnSort2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSort2.Click Dim i As Integer, j As Integer, k As Integer Dim temp As Integer Dim gap As Integer Dim count As Integer gap = count / 2 Do While gap > 0 k = 0 Do While k < gap j = k + gap Do While j < count i = j - gap Do While i >= k If intNumber(i + gap) > intNumber(i) Then temp = intNumber(i + gap) intNumber(i + gap) = intNumber(i) intNumber(i) = temp Else Exit Do End If i = i - gap Loop j = j + gap Loop k = k + 1 Loop gap = gap / 2 Loop 'Display numbers to list lstShell.Items.Clear() For i As Integer = 0 To 8 lstShell.Items.Add(intNumber(i)) Next End Sub End Class
- 締切済み
- Visual Basic
- loop終了後のセルの一個右から同様のloopを行う方法
・loop終了後のセルの一個右から同様のloopのプログラムを組むのが目的です。 ・データはA列にランダムに数字が入っているものとします。 ・条件式としては基準値より小さな数字が一個下のセルにあったら↓を表示して、さらに下に行くという風にして、基準よりも多くなったところでloopがストップする設定です。 ・困っているところをうまく表現できてないかも知れませんが、よろしくお願いします。 --------------------------- Sub 比較() Dim i As Integer Dim j As Integer Cells(1, 2).Select ActiveCell.FormulaR1C1 = "=IF(RC1>R1C1,""→"",""↓"")" i = 1 Do While Cells(i, 2).Value <> "" If Cells(i, 2).Value = "↓" Then Cells(1 + i, 2).Select ActiveCell.FormulaR1C1 = "=IF(RC1>R1C1,""→"",""↓"")" End If i = i + 1 Loop Cells(i - 1, 3).Select ActiveCell.FormulaR1C1 = "=IF(RC1>R" & i - 1 & "C1,""→"",""↓"")" j = 1 Do While Cells(i - 2 + j, 3).Value <> "" If Cells(i - 2 + j, 3).Value = "↓" Then Cells(i - 1 + j, 3).Select ActiveCell.FormulaR1C1 = "=IF(RC1>R" & i - 1 & "C1,""→"",""↓"")" End If j = j + 1 Loop End Sub
- ベストアンサー
- Visual Basic
- 1から入力された数までの素因数を数えるプログラム
こんにちは 1から入力された数(N)までの素因数を数えるプログラムを 作成したいのですが、うまくいきません。 たとえば10と入力すると2と表示されてしまいます。 どこがおかしいのかわかりません。 どなたか教えてください。おねがいします。 N個の配列を用意し、1を入れていき、 素因数でない数の要素には0をいれて、 最終的に1が入っている配列の数を数えて1~Nまでの 素因数の数を数える方法を考えています。 Dim M As Integer Dim N As Integer Dim i As Integer Dim j As Integer Dim sum As Integer Dim L(1000) As Double N = Val(TextBox1) M = N i = 1 Do Until i > N L(i) = 1 i = i + 1 Loop i = 2 Do Until i > M j = i * 2 Do Until j > M L(j) = 0 j = j + 1 Loop i = i + 1 Loop sum = 0 For i = 2 To N If L(i) = 1 Then sum = sum + 1 End If Next i
- ベストアンサー
- Visual Basic
- VB2008 2バイト文字の化け字は当然! Yes or No?
Function FileGetChar(ByVal f As String, ByVal p As Integer) As String Dim n As Integer = FreeFile() Dim c As Char = “” If File.Exists(f) Then FileOpen(n, f, OpenMode.Random, OpenAccess.Read, , 1) Seek(n, p) If Not EOF(n) Then FileGet(n, c) End If FileClose(n) End If Return c End Function このようにSeek関数とFileGet関数を利用する限りでは2バイト文字の化け字は避けられない! 一体、この私の判断は正しいのでしょうか? VB2008 Express Edition
- 締切済み
- Visual Basic
- Loopの使い方について
Rubyで 数字を下記のようなやり方では1~12 までの数字をまわせるプログラムと 文字のa~l までまわせるプログラムを合体させたいのですがどのようにすればよいでしょうか? #1-12 までの数値をまわすソース n=1 loop do puts n if n == 12 break end n += 1 end 実行結果↓ 1 2 3 4 5 6 7 8 9 10 11 12 # a~ lの小文字をまわすソース ["a","b","c","d","e","f","g","h","i","j","k","l"].each do |n| puts n end 実行結果 a b c d e f g h i j k l 上記のプログラムをあわせて、実行結果が、↓ 1 a 2 b 3 c 4 d 5 e 6 f 7 g 8 h 9 i 10 j 11 k 12 l ↑ このようにするには、どのようにすればよいでしょうか。 よろしくお願いします。
- ベストアンサー
- Ruby
- VB2008: 文字列を逆順にする関数が判らない!
Sub Main() Debug.Print(Reverse("ABC") End Sub Function Reverse(ByVal aChars As String) As String Dim C As Char Dim I As Integer Dim J As Integer Dim L As Integer = aChars.Length - 1 J = L Do While I < J C = aChars.Chars(I) aChars.Remove(I, 1) aChars.Insert(I, aChars.Chars(J)) aChars.Insert(J, C) aChars.Remove(J + 1, 1) J -= 1 I += 1 Loop Return aChars End Function 1、"ABC"の"A"を変数 C に保存。 2、"ABC"の"A"を削除。 3、"BC" の先頭に"C"を挿入。 4、"CBAC" の3番目(J=2)に変数Cを挿入。 5、"CBAC" の4番(J+1=3)を削除 6、"CBA" を戻り値にセット。 という Reverse 関数ですが動作しません。 一体、どこでどのように考え違いをしているのでしょうか? 全くわかりません。 宜しくお願いします。
- ベストアンサー
- Visual Basic
- エクセルVBAの繰り返し処理の質問
C列にある項目とG列にある項目を比較して、 一致し、H列にある数字が10以上ならば、B列にフラグ1を立てる という処理を行いたいんですが、 下記ぐらいまでしか作れず、うまくいきません・・・ Sub フラグを立てる処理() Dim i As Integer Dim j As Integer Dim k As Integer i = 1 j = 1 Do j = j + 1 Do i = i + 1 If Cells(j, 8) > 9 Then Cells(i - 1, 4) = 1 End If Loop Until Cells(i, 3) <> Cells(j, 7) Or Cells(i, 3) = "" Loop Until Cells(j, 7) = "" End Sub わかる方がいらっしゃいましたら、お願いします。
- 締切済み
- Visual Basic
- VBA Do~Loopについて
VBA勉強中です。 マクロの作成は完了しているのですが、処理効率について指摘を受け、 その際に助言もいただいたのですが、自身の勉強不足、理解不足で どのように変更すれば良いのか分からず、教えていただきたいです。 Do While Ax2 <= 30 で30回繰り返すのではなく (Cells(Ax2,"B").Value <> "" ) の間繰り返すように変更したいです。 ---------------- Sub test() Dim File1(30) As string Dim Sheet1(30) As string Dim Sheet2(30) As string Dim Cnt As Integer Ax1=1 Ax2=7 Do While Ax2 <= 30 If Cells(Ax2, "B").Value <> "" Then File1(Ax1) = Cells(Ax2, "B").Value Sheet1(Ax1) = Cells(Ax2, "C").Value Sheet2(Ax1) = Cells(Ax2, "D").Value Cnt =Ax1 End If Ax1 = Ax1 + 1 Ax2 = Ax2 + 1 Loop End Sub ---------------- お手数ですが、よろしくお願いいたします。
- ベストアンサー
- Visual Basic
- 【VB2005】です。txtファイルを配列に読み込もうとしています。
45*45のtxtデータを配列に読み込もうとしているのですが、エラーが出ます。なぜでしょうか? 宜しくお願いします。 【VB2005を使っています。】 Private Sub OpenButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OpenButton1.Click Dim selectButton As DialogResult Dim filename As String Dim i, j As Integer \'開く ダイアログの表示 selectButton = DBOpenDialog1.ShowDialog() filename = DBOpenDialog1.FileName If selectButton = Windows.Forms.DialogResult.OK Then Dim sr As System.IO.StreamReader = Nothing Dim readFields() As String i = 0 sr = New System.IO.StreamReader(filename, System.Text.Encoding.Default) Do Until sr.EndOfStream readFields = sr.ReadLine().Split(\",\") For j = 0 To 44 Tests1(i, j) = readFields(j) Next j i += 1 Loop sr.Close() End If End Sub
- ベストアンサー
- Visual Basic
- VBA 九九 Do While
VBAのDo Whileステートメントを使って九九の表をつくりたいのですが、何度やっても途中で詰まり、実行に至りません。 For NextとDo untilではできたと思うのですがDo Whileがどうしてもわからなくて… どなたか助けてください。お願いします。 Sub 九九計算_for() Dim i, j As Integer For i = 1 To 9 For j = 1 To 9 Cells(i, j).Value = i * j Next Next End Sub Sub 九九計算_do_until() j = 1 Do i = 1 Do Cells(j, i).Value = i * j i = i + 1 Loop Until i = 10 j = j + 1 Loop Until j = 10 End Sub
- ベストアンサー
- Visual Basic
お礼
Function FileGetChar4(ByVal f As String, ByVal p As Integer) As String Dim i As Integer = 1 Dim j As Integer = 0 Dim l As Integer Dim n As Integer = FreeFile() Dim c As Char If File.Exists(f) Then FileOpen(n, f, OpenMode.Random, OpenAccess.Read, , 1) l = FileLen(f) Do While (i + j <= l) And (i <= p) c = "" FileGet(n, c, i + j) j = j - (Math.Abs(Asc(c)) > 255) i = i + 1 Loop FileClose(n) End If Return c End Function これで正常に動作しないので困っています。