[[20211228204412]] 『単語も反転してしまいます。』(教えて欲しいです。) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『単語も反転してしまいます。』(教えて欲しいです。)

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 >


Option Explicit

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


ありがとうございます!申し訳ないのですが、Do Loopを使ったやり方を知りたいのですが、もしよろしければ、そちらも教えていただけると、ありがたいです。
(教えて欲しいです。) 2021/12/28(火) 21:05

Function WordReverse(ByVal s As String) As String
    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.