アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下のようにA列に通し番号(1~),D列にIDが入力されているシートがあります。
A列中の指定した範囲の通し番号(例,3~5)と同じ行にあるD列の値を順番にセル番地(X200)に上書きでコピペするマクロはどのように作成したら良いでしょうか。
(以下の例でいうと,edfc,tgod,yudpをX200セルに順番に上書きでコピペされるようにしたいです)
調べても力不足で,コードの書き方がわかりません。わかる方,ご教示いただけますようお願いいたします。

A列(通し番号)  ~   D列(ID)
1             abcd
2             acae
3             edfc
4             tgod
5             yudp
6             yupo

A 回答 (4件)

No2です。



>通し番号の最初と最後を入力するためのセルがあり,~
>チェックのコードは不要です。
無チェックで良いのなら単純にループすればすむ話では?
セル位置が不明なので、文章混じりになりますが、

Dim i As Long

For i = スタート番号 To エンド番号
Range("X200").Value = D列のスタートセル.Offset(, i - 1).Value
  '残りの処理
Next i

※ 番号は、通し番号かつ1始まりであるという条件です。
    • good
    • 0
この回答へのお礼

いろいろとありがとうございます。
なんとか動きました。

お礼日時:2023/02/02 18:25

No3です。



連投失礼。

Offsetの位置を間違えてしまっていました。
Offset(i - 1) が正しいですね。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2023/02/02 18:25

No1です



も一度見たら無駄がありましたね。修正しておきます。

パターンは
 reg.Pattern = "^(\d*)(~|~)?(\d*)$"
で十分でした。
    • good
    • 0
この回答へのお礼

ありがとうございます。
チェックのコードは不要です。
先ほどのお礼で書いておけば良かったのですが,行いたい処理は,以下のとおりです。

1,A列中の指定した範囲の通し番号と同じ行にあるD列の値をセル番地(X200)に上書きでコピペする。(VBAで処理。通し番号の最初,最後を入力するためのセルあり)
2,D列のIDごとに対応した表が関数等で作成される。(非VBAで処理)
3,作成された表を印刷(VBAで処理)
4,指定した範囲内の次の通し番号につき,上の1~3の処理を行う。(VBAで対応,do~whileの構文ですか?)

質問文では2番と3番の処理を省略してしまったため,上書きするのであれば最後の番号をコピペするだけで良いのではないかというご指摘を受けてしまいました。(3の処理のコードはおそらくわかります)

お礼日時:2023/02/02 09:57

こんにちは



>順番にセル番地(X200)に上書き
マクロで「順番に上書き」すれば、最後の状態だけ残ります。
ですので、それだけが目的なら、最後の処理だけ行えば十分でしょう。

あるいは、質問文では省略されているだけで、順に何らかの処理を行いたいってことでしょうかね。
「3~5」のような入力値を扱うのは面倒なので止めた方が良いと思いますが、どうしてもやりたいのなら、まずは入力値のチェックをしましょう。
 ・「~」が1個以下である。
 ・「~」以外は全て数字である。
をチェックすることで、入力値は
「3」
「~5」
「3~」
「3~5」
のような形式になっていることまではチェックできます。

その上で、「~」を含む場合は
 Split(入力値, "~")
で二つの数値部分を分解することができます。
(形式チェックを正規表現で行えば、チェックと同時に数値部分も取得できます)
一方の数値が省略されている場合は、通し番号の上限(または下限)で補完します。
同時に、入力した数値が通し番号の範囲内であることのチェックも必要ですね。
数値の範囲が決まれば、あとはVlookupでもよいですし、通し番号なら直接D列のOffsetでも参照できるでしょう。


以下は、正規表現を利用した場合の入力値チェックの簡単な一例です。
ご参考にでもなれば。
Dim reg As Object, m As Object
Const regn = "VBScript.RegExp"
Set reg = CreateObject(regn)
reg.Pattern = "^(\d+)?(?:(~|~)(\d+)?)?$"
Set m = reg.Execute(入力文字列)

この結果、
・m.count=0 なら入力形式が異なる(=マッチしない)
マッチする場合は
・m(0).SubMatches(0) に最初の数字文字列(省略の場合は空文字)
・m(0).SubMatches(1) に「~」の文字(ない場合は空文字)
・m(0).SubMatches(2) に右側の数字文字列 (省略の場合は空文字)
が得られますので、後はそれぞれの値を判断すれば良いことになります。

※ 入力値が空白の場合もマッチしますが、SubMatchesは全て空白になります。
※ 上記では「~」は半角文字、全角文字のどちらでも良いことにしてあります。
    • good
    • 0
この回答へのお礼

ありがとうございます。
ご回答いただいて申し訳ないのですが,入力値のチェックは不要です。
通し番号の最初と最後を入力するためのセルがあり,そこから取得することを考えています。

お礼日時:2023/02/02 09:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!