[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『エクセルのセルの変数名を取得したい』(斎藤)
初めて利用します。
すいません、調べたのですが見つからなかったので質問させていただきます。
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
セルのa1にAと書いてあって
cells(1,1)を利用して、変数Aに5を入れる方法を聞いているのですが
教えていただいた方法で出来るのでしょうか?
(斎藤) 2020/12/21(月) 17:41
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
(斎藤) 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
>VBAに記載せずに楽に出来る方法を探していました。 現状のコードなんてないんじゃないの。
(cv) 2020/12/22(火) 09:38
各マクロから 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
プログラム的には
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
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
そもそも希望の内容が無理矢理なのです。
その無理矢理を必要とする情報が欲しいのです。
まず、配列、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の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.