[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『単語も反転してしまいます。』(教えて欲しいです。)
Apple grape Orangeの単語をOrange grape Appleという並び順にしたいのですが、自分の力では、並び順はいいんですが、文字まで反転してしまうんです。Orange grape Appleという並び順だけ変更するには、どのようなプログラミングが必要ですか?Do Loopを使ってやりたいので、効率的じゃないのは重々承知の上です。
Sub sample()
Dim s As String
s = "Apple Grape Orange" MsgBox reverse(s) End Sub
Function reverse(s As String) As String
reverse = s
n1 = 1
n2 = Len(s)
Do While n1 < n2
c1 = Mid(s, n1, 1) c2 = Mid(s, n2, 1) Mid(reverse, n1, 1) = c2 Mid(reverse, n2, 1) = c1
n1 = n1 + 1 n2 = n2 - 1 Loop
End Function
< 使用 Excel:unknown、使用 OS:Windows10 >
Sub sample()
Dim s As String s = "Apple Grape Orange" MsgBox WordReverse(s) End Sub
Function WordReverse(ByVal s As String) As String
Dim vv As Variant Dim v As Variant Dim i As Long Dim ss() As String
vv = Split(s) i = UBound(vv)
ReDim ss(0 To i) For Each v In vv ss(i) = v i = i - 1 Next
WordReverse = Join(ss, " ") End Function
こんな感じとか。
(まっつわん) 2021/12/28(火) 21:01
Dim vv As Variant Dim i As Long Dim j As Long Dim ss() As String
vv = Split(s) i = UBound(vv) j = 0 ReDim ss(j To i)
Do ss(i) = vv(j) i = i - 1 j = j + 1 Loop Until i = 0
WordReverse = Join(ss, " ") End Function
こんな感じ?動作確認してないです。
(まっつわん) 2021/12/28(火) 21:26
こんばんは! 例の場合は、三つの単語と考えればいいのではないのでしょうか?と思いますけど、、 久々なんで勘違いしているかも???です。。。
Option Explicit Sub sample() Dim s As String s = "Apple Grape Orange" MsgBox reverse(s) End Sub Function reverse(s As String) As String Dim n1 As Long Dim n2 As Long Dim c1 As String Dim c2 As String Dim v As Variant v = Split(s, " ") n1 = 0 n2 = UBound(v) Do While n1 < n2 c1 = v(n1) c2 = v(n2) v(n1) = c2 v(n2) = c1 n1 = n1 + 1 n2 = n2 - 1 Loop reverse = Join(v, " ") End Function (SoulMan) 2021/12/28(火) 21:57
参考に Sub Test() Dim s As String Dim a As Variant Dim v As Variant
s = "Apple Grape Orange" With CreateObject("System.Collections.ArrayList") For Each a In Split(s) .Add a Next .Reverse v = .toarray End With MsgBox Join(v) End Sub
(ピンク) 2021/12/28(火) 22:19
>Do Loopを使ってやりたいので、 無理やり使ってみました。 Sub sample() Dim s As String s = "Apple Grape Orange" MsgBox reverse(s) End Sub Function reverse(s As String) As String Dim v As Variant Dim w As Variant Dim i As Long v = Split(s) ReDim w(UBound(v)) Do While i <= UBound(v) w(i) = v(UBound(v) - i) i = i + 1 Loop reverse = Join(w) End Function
(ピンク) 2021/12/28(火) 23:03
もう『 お腹いっぱい 』でしょうが… 参考として コードを短く簡潔に…理解し易く(品評会)なら、確実に最下位です。(笑)
Option Explicit Sub Sample() Dim s As String s = "Apple Grape Orange" ReDim s_str(2) s_str(0) = Left_str(s) s_str(1) = Middle_str(s) s_str(2) = Right_str(s) Call reverse(s_str) End Sub Sub reverse(s_str())
Dim n1 As Long, n2 As Long Dim s, r
If IsArray(s_str) = False Then Exit Sub End If n1 = LBound(s_str) n2 = UBound(s_str) Do If n1 >= n2 Then Exit Do End If s = s_str(n1) s_str(n1) = s_str(n2) s_str(n2) = s Exit Do '' Exit Do か添え字を移動させる 'n1 = n1 + 1 'n2 = n2 - 1 Loop r = Join(s_str, " ") MsgBox r
End Sub Function Left_str(s As String) As String Left_str = Left(s, InStr(s, " ") - 1) End Function Function Right_str(s As String) As String Right_str = Right(s, InStr(s, " ") + 1) End Function Function Middle_str(s As String) As String Dim Change_str As String Change_str = Mid(s, InStr(s, " ") + 1) Middle_str = Left(Change_str, InStr(Change_str, " ") - 1) End Function
(あみな) 2021/12/29(水) 17:00
こんばんは! なるべく原型を尊重しつつ Split や Join を使わずに だだっだぁ〜〜とタイプする感じにしてみました。 でもこれだと文字数に制限があるかもしれませんね? まぁ、、サンプルということで何かの参考になれば幸いです。。。。 では、、では、、、
Option Explicit Sub sample() Dim s As String s = "Apple Grape Orange" MsgBox reverse(s) End Sub Function reverse(s As String) As String Dim n1 As Long Dim n2 As Long Dim c1 As Variant Dim c2 As Variant Dim x As Variant Dim v As Variant Dim y As String Dim i As Long Dim n As Long ReDim x(0) ReDim v(0) For i = 0 To Len(s) - 1 v(UBound(v)) = Mid(s, i + 1, 1) If Mid(s, i + 1, 1) = " " Then ReDim Preserve v(UBound(v) - 1) x(UBound(x)) = v ReDim v(0) ReDim Preserve x(UBound(x) + 1) Else x(UBound(x)) = v ReDim Preserve v(UBound(v) + 1) End If Next ReDim Preserve v(UBound(v) - 1) n1 = 0 n2 = UBound(x) Do While n1 < n2 c1 = x(n1) c2 = x(n2) x(n1) = c2 x(n2) = c1 n1 = n1 + 1 n2 = n2 - 1 Loop For i = LBound(x) To UBound(x) For n = LBound(x(i)) To UBound(x(i)) y = y & x(i)(n) Next y = y & " " Next y = Left(y, Len(y) - 1) reverse = y Erase c1, c2, x, v End Function (SoulMan) 2021/12/29(水) 20:30
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.