エクセルでセルを指定してmidステートメントを使う方法について

このQ&Aのポイント
  • エクセルで特定のセルを指定してmidステートメントを使用する方法について質問があります。現在、セルを直接指定する方法がわからず、エラーが発生しています。
  • 一度変数に値を代入してからmidステートメントを使用すると問題なく実行できることに気付きましたが、直接セルを指定する方法がない理由がわかりません。
  • どうすればエクセルでセルを指定してmidステートメントを使用することができるのか、教えてください。
回答を見る
  • ベストアンサー

midステートメント セルを指定したい

エクセルなのですが、 Sub N文字目を置換する1() Dim N As Long Range("a1").Value = "abcde" N = 2 '置換する文字の位置 ’start(省略不可) Mid(Range("a1").Value, N) = "X" MsgBox Range("a1").Value End Sub このように、セルを指定することはできないのでしょうか? このコードを実行しようとすると、 Mid(Range("a1").Value, N) = "X"の部分で「変数が必要です」とコンパイルエラーになります。 Sub N文字目を置換する2() Dim moji As String Dim N As Long Range("a1").Value = "abcde" moji = Range("a1").Value N = 2 Mid(moji, N) = "X" MsgBox moji End Sub このように、セルの値を一度変数に入れると問題なく実行できますが、 なぜダイレクトにmidステートメントでセルを指定できないのかわからないので教えてください。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

こんにちは。 昔は、Midステートメントは使われていたのですが、今は、ほとんどお目に掛かりません。おそらく、右辺から左辺に入れるというスタイルでないので、読みにくいことが原因なのかもしれません。 ヘルプより このように書かれています。 '// Mid ステートメント Mid(stringvar, start[, length]) = string stringvar 変更する文字列変数の名前を指定します。◎ start  stringvar の中の置き換えを始める位置を文字数単位で指定します。 length 置き換えを行う文字数を指定します。省略すると、文字列すべてが使われます。 string 新しく置き換える文字列式を指定します。 '// 最初のコードで、エラーになるのは、受け皿になる入れ物がないからです。 Range("A1").Valueでは指定した入れ物にはなりません。 '他の同様のサンプル '// Sub TestReplace() Dim moji As String Dim tmp As String Const N As Integer = 2   Range("A1").Value = "abcde"   moji = Range("A1").Value   tmp = Mid(moji, N, 1)   Range("A1").Value = Replace(moji, tmp, "X",1, 1) End Sub '// 'こちらはRange("A1")直接でも可能(右辺から左辺に入れるスタイルになっている) ' Range("A1").Value = WorksheetFunction.Replace(Range("A1").Value, 2, 1, "X") Sub TestFuncReplace() Dim moji As String Dim tmp As String Const N As Integer = 2   moji = Range("A1").Value   Range("A1").Value = WorksheetFunction.Replace(moji, N, 1, "X") End Sub '//

NMOCVNWXHTPU
質問者

お礼

ご回答ありがとうございます。

その他の回答 (2)

  • notnot
  • ベストアンサー率47% (4845/10256)
回答No.2

エラーメッセージからわかるとおり、Midステートメントの第一引数は、(文字列)変数だけです。 ヘルプを見てもそう書いてあります。 なぜと言われてもそういう言語だからとしか言えない。 Range("a1").Value は変数じゃ無くてプロパティです。

NMOCVNWXHTPU
質問者

お礼

ご回答ありがとうございます。

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.1

VBAは   Mid(Range("a1").Value, N) = "X" → "aXcde" とした「あと」に、この文字列をどうしていいのかわからないようです。 VBAは「行同士のつながりは基本的に無い」ですから、 後の行に処理を渡したいなら変数に入れたりして、どこかに格納しないとダメなのです。 後者の場合、変数「moji」に格納したものを書き換えていますので、 (私は初めて見るMidの使い方でしたが)上手くいっているのですね。 前者は、A1セルの値を書き直した後に「何もしていない」のです。 セルに置き換えた後の文字列を入れる命令も無いですね。 変数に格納する構文でもないですね。 普通に考えると、   Mid(Range("a1").Value, N) = "X" と与えると「False」を返しますから、VBAにとっては 「いきなり"False"言われても・・・」と言うわけです。

NMOCVNWXHTPU
質問者

お礼

ご回答ありがとうございます。

関連するQ&A

  • 配列のメリットは?

    下記のコードは同じ動作をします。 Sub 普通() Dim moji1 As String Dim moji2 As String moji1 = Range("a1").Value moji2 = Range("a2").Value MsgBox moji1 & moji2 End Sub --------------------------------------------- Sub 配列() Dim moji(2) As String moji(1) = Range("a1").Value moji(2) = Range("a2").Value MsgBox moji(1) & moji(2) End Sub こういう場合は配列を使ったほうがいいのでしょうか? それとも配列は避けたほうがいいのでしょうか?

  • ifステートメント 大文字も小文字も区別なく

    Sub test() Dim moji As String moji = "a" If moji = "A" Then MsgBox "Aかaです" End If End Sub これだと、変数が小文字のaだからmsgboxが表示されません。 小文字も大文字も区別なく認識させるにはどうすればいいでしょうか? バイナリモードになってるようです。 Replace関数の場合は、vbTextCompareを付ければ Sub Sample() Dim moji As String moji = "a" Debug.Print Replace(moji, "A", "b", , , vbTextCompare) End Sub このように大文字小文字区別なく置換できますが このような事をifステートメントでやる方法を教えてください。

  • セルの中の改行された文字をひとつづつ取得したい

    図のように A1には「あ」「い」「う」が改行されて入っています。 Sub test() Dim moji(3) As String moji(1) = Range("a1").Value moji(2) = Range("a1").Value moji(3) = Range("a1").Value End Sub というコードを書いた時、 moji(1) ="あ" moji(2) ="い" moji(3) = "う" としたいのですが すべて"あいう"になってしまいます。 実現させるにはどうすればいいでしょう? アドバイスよろしくお願いします。

  • セルの値を取得して他のセルにひとつづつ配置したい

    こんにちわ VBS初心者です A1セルに12~14ケタほどの英文字と数字が混在したコードがあります それをB2,C2,D2,E2・・・・・セルに左から順にひとつづつ配置したいのですが、どうも上手く行きません Sub test4() Value = Range("A1") Range("A2").Value = Mid("A1", 1, 1) Range("B2").Value = Mid("A1", 2, 1) Range("C2").Value = Mid("A1", 3, 1) Range("D2").Value = Mid("A1", 4, 1) Range("E2").Value = Mid("A1", 5, 1) Range("F2").Value = Mid("A1", 6, 1) Range("G2").Value = Mid("A1", 7, 1) Range("H2").Value = Mid("A1", 8, 1) Range("I2").Value = Mid("A1", 9, 1) Range("J2").Value = Mid("A1", 10, 1) Range("K2").Value = Mid("A1", 11, 1) Range("L2").Value = Mid("A1", 12, 1) Range("M2").Value = Mid("A1", 13, 1) Range("N2").Value = Mid("A1", 14, 1) End Sub "A1"を値としてとらえているようで B2にはAが、C2には1が入ってしまいます A1の値を取り出すにはどうしたら良いでしょうか よろしくお願いします

  • 指定したセルに1がない時、For を抜けたいのですが・・・

    Office XP Personal 2002 Excel 2002 指定した範囲セルに1がない時、下記の1つの For だけ を抜けたいのですが・・・ どのように変更すればよろしいでしょうか? よろしくお願い致します。 Sub test() Dim i As Integer Dim n As Range For i = 1 To Worksheets.Count - 1  Worksheets(i).Activate  For Each n In .Range("E6", .Range("E6").End(xlDown))   If Not n.Cells.Value = 1 Then   End If   Next n    MsgBox "「1」 がありません。", 48   Exit For  'For Each n In .Range("E6", .Range("E6").End(xlDown))   '続く   '・    '・ End Sub

  • エクセルVBAで指定したセルへジャンプするコード(追加の追加質問です)

    http://oshiete1.goo.ne.jp/qa2903797.html たびたびすみません。最後にひとつだけお願いします。 お教えいただいた下のコードは順調に動作するのですが、 対象セルが結合セルの場合、エラーが出てしまいます。 とまってしまうコードの部分は With Selection.AddComment です。 エラーメッセージにはプロシージャの呼び出し、 または引数が不正です。(Error 5)と書いてあります。 結合セルは動作しないものでしょうか? Sub test01() Dim x As String Dim ThisSheet_Name As String Dim Sheet_Name As String Dim Range_Name As String Dim I As Integer, n As Integer Dim Ans As Integer Dim myComment As String '新規追加 Dim Colors As Integer '新規追加 ThisSheet_Name = ActiveSheet.Name '設定シート Select Case Workbooks.Count Case 1 MsgBox "チェックするファイルがありません。" Exit Sub Case 2 For n = 1 To 2 If Workbooks(n).Name <> ThisWorkbook.Name Then x = Workbooks(n).Name '開いている“もうひとつのブック”の名前 End If Next Case Else MsgBox "他に開いているファイルが複数のため対象を特定できません。" Exit Sub End Select I = 0 Do While (1) With ThisWorkbook.Sheets(ThisSheet_Name) If .Range("A3").Offset(I, 0).Value = "" Then MsgBox "検査項目は以上です。" ThisWorkbook.Activate Exit Do 'A列の3行目以下が、空白なら終わる End If Sheet_Name = .Range("A3").Offset(I, 0).Value Range_Name = .Range("B3").Offset(I, 0).Value myComment = .Range("C3").Offset(I, 0).Value End With Windows(x).Activate Sheets(Sheet_Name).Select Range(Range_Name).Select Colors = Selection.Interior.ColorIndex '新規追加 Selection.Interior.ColorIndex = 6 With Selection.AddComment .Visible = True .Text myComment End With Range(Range_Name).Select Ans = MsgBox("「次をチェックしますか?」", vbYesNo) Selection.Interior.ColorIndex = Colors '修正 Selection.ClearComments '新規追加 If Ans = vbYes Then I = I + 1 Else Exit Do End If Loop End Sub

  • excelVBAで、Midの引数をLenで指定できる?

    ワークシートSheets1上のセルA1に、次のような文字列があり、 Length 50.0mm この中の、数字の部分だけをユーザーフォームのtextbox1に抜き出したいと思っています。 Length と、単位mmは全ての場合で共通ですが、数字は50.0の場合も5.0の場合もあり、文字数がまちまちです。 textbox1.value=Mid(Sheets("Sheets1").Range("A1").value, 8,Len(Sheets("Sheets1").Range("A1").value-2) のようにMid関数の引数にLen関数を使ったり、 x=Len(Sheets("Sheets1").Range("A1").value textbox1.value=Mid(Sheets("Sheets1").Range("A1").value, 8,x-2) のように変数xを介してみたりしたのですが、mmが表示されてしまいます。 (ちなみにLenを使わずx=13と書くと、mmなしの数値だけがうまく表示されます) VBAはトライ&エラーで使っている状態で、セルの取り扱い(.valueとか.textとか)や変数の宣言はかなり適当です。 この辺りが間違っているんでしょうか?? できればMidとLenを使った解決法、それが無理なら他の方法でも結構ですので、ご教授頂けると助かります。 よろしくお願いします。

  • mid関数とmidステートメントの違いを教えてくだ

    Sub test1() MsgBox Mid("abc", 2) End Sub は、mid関数ですか?midステートメントですか? ヘルプを見ると、 --------------------------------------------------------- Mid ステートメントの使用例 次の例は、Mid ステートメントを使って、 文字列変数の中にある指定した文字数分の文字を他の文字列に置き換えます。 Dim MyString, FirstWord, LastWord, MidWords MyString = "Mid Function Demo" ' 文字列を定義します。 FirstWord = Mid(MyString, 1, 3) ' "Mid" を返します。 LastWord = Mid(MyString, 14, 4) ' "Demo" を返します。 MidWords = Mid(MyString, 5) ' "Function Demo" を返します。 --------------------------------------------------------- も --------------------------------------------------------- Mid 関数の使用例 次の例は、Mid 関数を使って、 文字列の中から指定した文字数分の文字を返します。 Dim MyString, FirstWord, LastWord, MidWords MyString = "Mid Function Demo" ' 文字列を定義します。 FirstWord = Mid(MyString, 1, 3) ' "Mid" を返します。 LastWord = Mid(MyString, 14, 4) ' "Demo" を返します。 MidWords = Mid(MyString, 5) ' "Function Demo" を返します。 --------------------------------------------------------- も同じです。 mid関数とmidステートメントの違いを教えてください。 ご回答よろしくお願いします。

  • エクセルのマクロで複数セル指定は?

    以前(7月22日 質問No.936181)の質問でご回答を頂いたマクロなんですが、 Private Sub Worksheet_Change(ByVal Target As Range) Dim MyData As String Dim i As Integer Dim ImaNanji As String Dim SakkiNanji As String Dim ImaNanpun As String Dim SakkiNanpun As String SakkiNanpun = Cells(2, 3).Value ImaNanji = Cells(1, 3).Value ImaNanpun = Mid(ImaNanji, Len(ImaNanji) - 4, 2) If ImaNanpun <> SakkiNanpun Then Application.EnableEvents = False For i = 10 To 2 Step -1 MyData = Cells(i - 1, 2).Value Cells(i, 2).Value = MyData Next i MyData = Cells(1, 1).Value Cells(1, 2).Value = MyData Cells(2, 3).Value = ImaNanpun Application.EnableEvents = True End If End Sub A1のデータをB1からB10に一分おきにつぎつぎに書き込むというものなんですが、ひとつのセルではなく複数のセル(例えばA1からA30の30個のセル)をいっぺんに書き込むようにしたいのですが可能でしょうか? よろしくお願いします。

  • エクセルVBAでセル範囲のデータをクリップボードに

    セル範囲のデータをテキストとしてクリップボードに取り込みたいのです。 http://okwave.jp/qa/q5650002.html#16327676 の回答ANo2を見て Sub test01() Dim myData As DataObject Dim myCb As Variant Dim x x = "TESTデータです。" Set myData = New DataObject myData.SetText x myCb = myData.GetText myData.PutInClipboard End Sub は出来ました。 そこで、セル範囲A1:B3をクリップボードに貼ろうといろいろやってみました。 一応、下記でできましたが、実際にはもっと広い範囲を取り込みたいので、もっと簡単な方法はないでしょうか? Sub Clip() Dim myStr As String Dim myData As DataObject Dim myCb As Variant Set myData = New DataObject With Sheets(1) myStr = .Range("A1").Value & ":" & .Range("B1").Value & _ vbNewLine & .Range("A2").Value & ":" & .Range("B2").Value & _ vbNewLine & .Range("A3").Value & ":" & .Range("B3").Value End With myData.SetText myStr ', 1 myCb = myData.GetText If MsgBox("データ" & vbNewLine & myCb & " をクリップボードに送りますか? ", vbYesNo + vbQuestion, "確認") = vbNo Then Exit Sub End If myData.PutInClipboard End Sub

専門家に質問してみよう