[[20201221172157]] 『エクセルのセルの変数名を取得したい』(斎藤) ページの最後に飛ぶ

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

 

『エクセルのセルの変数名を取得したい』(斎藤)

初めて利用します。
すいません、調べたのですが見つからなかったので質問させていただきます。

dim A as variant,B as variant,C as variant
と定義しておき
エクセルのセル上のa1にA、a2にB、a3にCと記載しております。

この際、cells(a1)やcells(a2)を利用してAやBという変数に値を入れる方法はありますか?

< 使用 Excel:Excel2013、使用 OS:Windows10 >


 名前の定義を使ったらいかがでしょう?
(通りすがり) 2020/12/21(月) 17:28

 特定のセル範囲に
 a
 という名前を定義した場合です。

 Range("a")
 で定義した名前のセル範囲をRangeオブジェクト
 に格納できます。

 Sub test()
  MsgBox Range("a").Address
 End Sub
(通りすがり) 2020/12/21(月) 17:33

ごめんなさい、ちょっと理解が出来ないです。
例えば、変数Aに5という数値を入れたいとして

セルのa1にAと書いてあって
cells(1,1)を利用して、変数Aに5を入れる方法を聞いているのですが

教えていただいた方法で出来るのでしょうか?
(斎藤) 2020/12/21(月) 17:41



B1〜D5に「a」という名前を定義しておく
A1に「a」と手入力しておく

Sub test()

 Dim namae As String
 Dim rng As Range
 Dim atai As String
  atai = 10 '文字列型変数ataiに「5」を格納
  namae = Range("A1").Value 'A1セルに入力されている文字列をString型変数に格納
  Set rng = Range(namae) '変数に格納した文字列で定義されている名前のセル範囲をRangeオブジェクトに格納
  rng.Value = atai 'Rangeオブジェクトに変数ataiに格納した文字列を代入
  Set rng = Nothing
End Sub
(通りすがり) 2020/12/21(月) 17:55

 >atai = 10 '文字列型変数ataiに「5」を格納

 ↓の間違いでした。

 atai = 10 '文字列型変数ataiに「10」を格納
(通りすがり) 2020/12/21(月) 17:56

 単純にこういうこと?

 a = ActiveSheet.Range("A1").Value
(通りすがり) 2020/12/21(月) 17:59

 ↑も違うっぽいな。
(通りすがり) 2020/12/21(月) 18:05

 どういう場面で、そのようなことをしたいのでしょうか?
(通りすがり) 2020/12/21(月) 18:08

 こういう方法もあるにはありますが。

 Sub test()
  Dim Mystr As String
   Select Case Range("A1").Value
    Case "A"
     Mystr = "AA"
    Case "B"
     Mystr = "BB"
    Case "C"
     Mystr = "CC"
    Case Else
         Mystr = "??"
   End Select
    MsgBox Mystr
 End Sub
(通りすがり) 2020/12/21(月) 18:15

たぶん、セルの【値】に応じて値をセットする【変数】を切り替えたい
ということなんじゃないですかね。
断言はしませんが、たぶん無理だとおもいます。

そもそも↓じゃないですか?

 ✕ cells(a1).Value    ○Range("A1").Value ○Cells(1,1).Value  ○Cells(1,"A").Value

擬似的にどこかのセルに名前をつけたり、TextBoxなどのオブジェクトを入れ物にして変数のように使ってしまうとかなら可能でしょうが、後で見てわけわからなくなりそうな気がするので私的には非推奨です。

(もこな2) 2020/12/21(月) 18:16


仰る通りです。
大量の変数を処理する際、VBAに記載せずに楽に出来る方法を探していました。
セルは分かりやすく書こうとして記載ミスしました。
セルa1に変数名があって、その変数名をセルa1を用いて操る方法は無いとのこと理解です。
どうもありがとうございました。

(斎藤) 2020/12/21(月) 18:25


 >大量の変数を処理する際、

 どのような変数か分かりませんが、
 配列は使えませんか?
(通りすがり) 2020/12/21(月) 18:40

大量の変数を処理する際、

この大量の変数を処理する現状のコードを提示してもらった方が適切な回答がつきそうな予感がします。
(hatena) 2020/12/21(月) 20:23


 >セルのa1にAと書いてあって 
 >cells(1,1)を利用して、変数Aに5を入れる方法を聞いているのですが
 意味合いがおかしいですね。
 セルの内容が A だったら 5 にするということですかね。

(>>>) 2020/12/21(月) 20:41


変数ではありませんが、collectionやdictionaryで
実現出来そうな気がしますが。
現状のコードを見ないと何ともといった感じですね。
(tkit) 2020/12/22(火) 08:06

 >VBAに記載せずに楽に出来る方法を探していました。
 現状のコードなんてないんじゃないの。

(cv) 2020/12/22(火) 09:38


なぜか出てないように見えますが、何度もアクセスするセルならRange型変数に入れれば良いのでは?

各マクロから Init を呼ぶ必要は生まれますが、やりたいことはきっとこういう意味なのかなと思いました。

 Private A As Range
Private B As Range
Private C As Range

Sub Init()

  Set A = Range("A2")
  Set B = Range("B3")
  Set C = Range("C10")
End Sub

Sub 処理本体

  Call Init()
  A.Value = 1
  MsgBox B.Value
  C.Interior.ColorIndex = 1
End Sub

(名無し) 2020/12/22(火) 10:13


無理矢理実現するとしてこんな感じなんでしょうけど・・・・
    Sub テキトー()
        Dim A, B, C

        Select Case Range("A1")
            Case "A": A = 5
            Case "B": B = 5
            Case "C": C = 5
        End Select

        MsgBox _
         "Aの中身は「" & A & "」です" & vbLf & _
         "Bの中身は「" & B & "」です" & vbLf & _
         "Cの中身は「" & C & "」です"

    End Sub

どのような処理を想定してたくさんの変数を用意しなければいけないと考えているのか私も疑問です。
(つい最近、変数てんこもりのコードを拝見する機会があったのでなおさら・・・)

(もこな2) 2020/12/22(火) 10:45


caseやif文で無理矢理すれば出来るのはわかります
目的はプログラムの記入量を減らす事でしたので
スマートな方法があればと思ってお伺いしました

プログラム的には
matchで見つけたエクセル上の特定のワードの位置を変数に入れたいのですが
その際に利用する変数が30個ほどあるので
match構文を30行書かないといけないので非常に面倒だと思った次第です。
(当然、その後の処理は変数によって異なります)
30行のmatch構文をfornextで廻せないかなと思い
上記質問をした次第です。

改めてお伺いしますが
セルa1にA、セルa2に5とあったら
変数であるAに5を入れる方法でスマートな物があったら教えてください
(斎藤) 2020/12/22(火) 14:27


 こんにちは ^^
セルの値を直接変数定義はエラーになると思います。
既にたくさんの皆様がご回答くださっておりますが
dim A(29)
か
dim A(1 to 30)
若しくは連想配列、コレクション等
で済むお話では??。。。^^;
外していましたらお許しを。。。m(__)m
(隠居じーさん) 2020/12/22(火) 14:43

すいません、外しています。
連想配列、コレクションは利用しておりますが
私の目的には叶いません。
他の解決案については全て目を通させていただいておりますが
申し訳ありませんが何も解決できません。
初めてこのサイトを利用させていただきましたが
これ以上解決できない問題でこのサイトを荒らすのは本意ではないので
今後は具体的な解決案以外はレスを控えさせていただきます。
(斎藤) 2020/12/22(火) 14:53

質問が具体的になっていないから、皆さん言いたいことを推測して回答するしかできないんだと思いますよ。
まるで、なぞなぞを解いているかのようです。

30行のMatchという、実際のコードがあるなら、泥臭くても今動いているものを貼ればもう少し期待している物に近い回答が得られると思います。

あと荒れると言うのとは違うので、気にしなくて良いと思います。

さて、既に30個の変数があって、それぞれにMatchを実行したいということですが、そういうことなら

 For Each v in Array(A,B,C,D,.....)
   Debug.Print Application.Match(v, 検索元配列, 0)
Next
で良いのではないかと思いました。

(通りすがりの) 2020/12/22(火) 15:08


 >エクセルのセル上のa1にA、a2にB、a3にCと記載しております。 
 >セルa1にA、セルa2に5とあったら
 どうしてa2の内容を変更したんだ。
() 2020/12/22(火) 15:25

 こんにちは ^^ 恐怖の憶測と推測のマトリックス^^;
     |[A]   |[B]   |[C]   |[D]   |[E]   |[F]   |[G]   |[H]   |[I]   |[J]   
 [1] |項目A1|項目B1|項目C1|項目D1|項目E1|項目F1|項目G1|項目H1|項目I1|項目J1
 [2] |      |Excel |      |      |      |      |      |      |      |      
 [3] |      |Excel |      |      |      |      |      |      |      |      
 [4] |      |      |      |      |      |      |      |      |      |Excel 
 [5] |      |      |      |      |      |      |Excel |      |      |      
 [6] |Excel |      |      |      |      |      |      |      |      |      
 [7] |      |Excel |      |      |      |      |      |      |      |      
 [8] |      |      |      |      |      |      |      |      |Excel |      
 [9] |      |      |Excel |      |      |      |      |      |      |      
 [10]|      |      |      |      |      |      |      |Excel |      |      
 [11]|      |      |      |Excel |      |      |      |      |      |      

 上記の様な表でExcelと入力されている列番号を求めるとして
[通りすがりの] さん のコードと変わりませんが^^;
あえて一括表示の為テキスト化しています。これですと30個でも1000個でも
システムが許す限りなんとかなるのでは。。。m(_ _)m
Option Explicit
Sub OneInstanceMain()
    Dim i As Long
    Dim x As Long
    Dim n As Long
    Dim v() As Variant
    Dim A() As Variant
    With Worksheets("Sheet1")
        v = .UsedRange.Value
    End With
    For i = 2 To UBound(v, 1)
        x = Application.Match("Excel", Application.Index(v, i, 0), 0)
        ReDim Preserve A(n)
        A(n) = CStr(x)
        n = n + 1
    Next
    MsgBox Join(A, Chr(13))
End Sub
尚、想像図が実際の物と違う場合は同じようなサンプルを
ご提示の上、おやりになりたいことをさらに、具体的にお教え
戴くと、解決の近道かと存じます。でわ。。。m(_ _)m
(隠居じーさん) 2020/12/22(火) 15:40

>caseやif文で無理矢理すれば出来るのはわかります
>セルa1にA、セルa2に5とあったら
>変数であるAに5を入れる方法でスマートな物があったら教えてください

そもそも希望の内容が無理矢理なのです。
その無理矢理を必要とする情報が欲しいのです。

まず、配列、collectionやdictionaryで対応することが
不可となる理由を教えてください。

 'A1セルに(配列のIndex)、A2に入れたい値
 Dim temp(1 To 30) As Variant
 temp(Range("A1").Value) = Range("A2").Value

情報提供を行う気が無いのなら、欲する情報は得られないでしょうから、
終わらせた方がいいと思いますがいかがでしょうか。
(tkit) 2020/12/22(火) 16:03


 例えばThisWorkbookモジュールで
 Public A As Long, B As Long, C As Long, ・・・

 と30個ほどの変数を宣言すれば、
 CallByNameで変数名を文字列指定して値をLetする事もGetする事も出来ますが、

     CallByName ThisWorkbook, "A", VbLet, 5
     Debug.Print CallByName(ThisWorkbook, "A", VbGet)

 でも
 個人的には気持ち悪いことこの上ないです。
 match構文を30行書いた方がまだいろいろマシな気がするww

(白茶) 2020/12/22(火) 19:55


 > セルa1にA、セルa2に5とあったら
 > 変数であるAに5を入れる方法でスマートな物があったら教えてください
  言語仕様上、それは無理です。

  というのは、
  s = Range("A1") & " = " & Range("A2") 
  などとして、 "A = 5" といった文字列s を作ります。

  この文字列s を、コードの一部と見なして、
  これを実行できるような言語もあります。
  Eval(s) みたいに。

  しかし、残念ながらVBA(VB6)にはそうした機能はないので、
  欲しい気持ちは理解できますが、
 > 他の解決案については全て目を通させていただいておりますが
 > 申し訳ありませんが何も解決できません。  
  と言われても、それは、思い通りにならなくて泣き出す赤子に等しいのです。

  Select Case文で分岐するか、 
  今の変数と異なる、Dictionaryを使うなどといった道しかないように思います。
(γ) 2020/12/22(火) 20:38

VBSに移植可能なコードであって、移植できる技術などがあればVBSのExecuteを使う手もありますが・・・
VBAメインの人には制約が多すぎておすすめしません

VBSのExecuteってのはこんなのです
https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc392447(v=msdn.10)

簡単なコードはこんなの
a1 = "A"
a2 = """VBScript - Execute"""
execute a1 & " = " & a2
msgbox a

(なんとなく書いてみる) 2020/12/22(火) 23:42


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.