プロが教えるわが家の防犯対策術!

エクセル2003と2007VBAで使用します。
ユーザーフォーム、添付画像項目「氏名」をコンボボックスで重複せず選択リストを表示させるにはどのように記述したら良いでしょうか? 宜しく御願いします。

「ユーザーフォーム、コンボボックスで重複せ」の質問画像

A 回答 (5件)

こんばんは。



VBAのコードを求めていらっしゃるのなら、回答者側としては、
ComboBox のList に、どこのシートからどのように重複を許してImport するコードを見せてほしいと言っているわけですね。最近、コードは見せられない、だから文章の説明的な質問の人が増えてきたと思うのです。画像添付でも、相手に伝えられる情報ではないです。
#3/#4さんの話も、#1/#2さんの話も熱心に正答をいただいているのに、解決に向かわないのは、残念です。

>シートにリストを予め用意しておくと膨大なリストからたくさんスクロールしてから選択するようにになってしまう為
2007のコマンドで、重複を排除する方法もありますし、両方なら関数で解く方法もあります。ComboBox に入れる以上は、千件以上のものを入れるというのは常識的にありえません。

それに、掲示板の回答は、必ずしも、コピー&ペーストで動くコードを提供してくれるとは限りません。それだけは心得ておいてください。


'//'UserForm モジュール

Private Sub UserForm_Initialize()
 ComboBox1.List = MakeUniqueList
End Sub

Function MakeUniqueList()
Dim objDic As Object 'New Scripting.Dictionary
Dim i As Long, j As Long
j = 1
Set objDic = CreateObject("Scripting.Dictionary")
With Worksheets("Sheet1")
  '2行目から
  For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
  If Not objDic.Exists(.Cells(i, 1).Value) Then
    objDic.Add .Cells(i, 1).Value, j
    j = j + 1
  End If
  Next
End With
  MakeUniqueList = objDic.keys
End Function
    • good
    • 0
この回答へのお礼

有難う御座いました。

お礼日時:2017/07/02 09:05

ANo3です



>シートにリストを予め用意しておくと~~選択するようにになってしまう為
>1対になっているsheet1に1行づつレコードが足され累積していった
結局のところ、「シートにあるリスト」を表示する方式なんですよね?
元データとは別に、整理されたリストが用意されているものとして考えるなら・・・

>には重複せず佐藤、鈴木、田中が出るようなコードとしたいです。
実行時に重複を省くのではなくて、そのシートに登録する時(何らかのタイミングで転記をしているのでしょうから)に重複しないようにすれば良いだけではないでしょうか?

・・・っていうことを、ANo3で書いたつもりなんですけど。
    • good
    • 0

こんにちは



コンボボックスの表示内容のリストは、配列を指定したり、AddItemで個々に設定する方法と、シートの範囲をリストとして指定する方法があると思います。

個別に設定する場合は、設定する際に重複を省けば良いでしよう。
シートの範囲等で指定する場合は、重複の存在するリストをそのまま利用するのではなく、一旦、重複を省いたリスト(または配列)を作成して、そちらを参照するようにすれば良いだけではないでしょうか?

項目数が非常に多い場合は、毎回ゼロから重複を省く処理をしていたのでは効率が悪いので、元のリストにアイテムを追加(?)した時に、同時に「重複を省いたリスト」にもバックグラウンドで反映するなどというようにしておくのが良いかもしれません。(重複している場合は追加されない)
とはいっても、コンボボックスでリスト表示する程度の数であれば、それほどの数とも思えませんので、毎回処理したところで大したことはなさそうですね。
    • good
    • 0
この回答へのお礼

フォローの回答有難う御座います。
シートにリストを予め用意しておくと膨大なリストからたくさんスクロールしてから選択するようにになってしまう為1対になっているsheet1に1行づつレコードが足され累積していった「氏名」だけがユーザーフォームの追加入力可能なコンボボックスにリストとして表示させるようにしたいです。
画像の「氏名」は例えば1対になっているsheet1、A列、A1は見出し「氏名」としてA2,佐藤、A3,鈴木、A4,田中、A5,佐藤、A6,鈴木と1行づつレコードとして追加されていきます。
ユーザーフォーム、コンボボックスの選択リストには重複せず佐藤、鈴木、田中が出るようなコードとしたいです。
多分A列をEndxlupでデータを拾ってフィルターして表示させるのかなと思っています宜しく御願いします。

お礼日時:2017/06/27 22:38

#1です。



結局「どこに」「何が」「どのように」の説明がないので何ともいえません。
同じ説明を繰り返してやりたいことを書くばかりでは話が前に進みません。

> 同じ氏名の場合があった時にコンボボックスリストが重複して表示されな
> いように
マスタ情報を持たずに 入力したデータをリストとして利用しようと考えるか
ら上手くいかないのでは? 何故マスタを作るという大事な作業を 省こうと
しているのでしょうか。

Excel2003でも使うなら 重複を省くためには連想配列を使う必要があります。

Excel(エクセル)VBA入門:重複なしのデータを抽出するいろいろな方法
http://www.eurus.dti.ne.jp/yoneyama/Excel/vba/vb …

マスタなしでやるなら 入力の度に 重複なしリストを抽出し直すということに
なるかと思います。
    • good
    • 0

「どこに」「何が」「どのように」がさっぱり分かりません。


そもそも何がどうなってコンボボックスが「重複」しているのですか?
    • good
    • 0
この回答へのお礼

わかりにくくてすいません。
1対になっているsheet1に1行づつレコードが足され累積していきます。
1件のデータを入力する時はユーザーフォームから入力するようにしています。
氏名が行数だけ増えていきますが同じ氏名の場合があった時にコンボボックスリストが重複して表示されないようにしたいと思います。

お礼日時:2017/06/27 12:03

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

Qファイルをまとめたい

エクセル初心者です。
デスクトップ上の一つのフォルダの中に同じようなファイルが100位あるのですが、そのファイル、1つになりませんか?
請求書01~請求書99(その時によっていろいろです。)という名前のブックをひとまとめにしてシート名が01~99みたいにしたいんです。(一番前には目次シートで)
ネットで同じような質問をさがしてやってみたのですがうまくいきません。

どなたか教えてください。お願いします。

Aベストアンサー

ANo3です

テスト中に入れ替えたのを、戻し忘れていました。
中ほどの
Set tb = Workbooks.Open(Filename:=ThisWorkbook.Path & "\" & fName, UpdateLinks:=0, ReadOnly:=False)

の部分は、以下が正です。すみません。

Set tb = Workbooks.Open(Filename:=ThisWorkbook.Path & "\" & fName, UpdateLinks:=0, ReadOnly:=True)

QVBAで、Functionを、クラスモジュールに置くか? 標準モジュールに置くか? 使い勝手は?

*.jpgファイルの撮影日時を、自作プログラムに読み込む必要に迫られ、いろいろお尋ねしました。
その結論は、ユーザー定義関数を自作して利用する、でした。
その時ご紹介頂いたのが、WEB公開のJpegExifクラスのCodeの利用でした。
その際、もっと端的に、システム内臓の、ADODB.Streamや、WIA.ImageFileを使って、
撮影日時を読み出す方法も教えて頂きました。

今回は、自前のCodeで撮影日時を読み出す事が目標でしたので、現在は、標準モジュールに、
JpegExifクラスの簡易版を置いて、自作プログラムを動かしています。

この際の試行錯誤の過程で、この簡易撮影日時読み出しFunctionを、クラスモジュールに置いたり、
標準モシュールに置いたり、いろいろテストしました。
両方の機能は同じで、使い勝手は標準モジュールに置いた方でした。

規模の大きいシステムで、クラスモジュールを使いこなされている方々にお伺いしたいのですが、
特定のFunctionを、クラスモジュールに置くか標準モジュールに置くかの判断の分岐点は何でしょうか?

*.jpgファイルの撮影日時を、自作プログラムに読み込む必要に迫られ、いろいろお尋ねしました。
その結論は、ユーザー定義関数を自作して利用する、でした。
その時ご紹介頂いたのが、WEB公開のJpegExifクラスのCodeの利用でした。
その際、もっと端的に、システム内臓の、ADODB.Streamや、WIA.ImageFileを使って、
撮影日時を読み出す方法も教えて頂きました。

今回は、自前のCodeで撮影日時を読み出す事が目標でしたので、現在は、標準モジュールに、
JpegExifクラスの簡易版を置いて、自作プログラムを動かしています。

こ...続きを読む

Aベストアンサー

昨日に書いた内容は、間違っていました。申し訳ありません。

『ブック間をまたぐようなものに関しては、その利便性は発揮しますが、……』
実際にこちらでユーザー定義関数を作ってやってみました。実際にやるのは、たぶん、二度目ぐらいで、うっすらと記憶のある程度でした。

私の言葉の説明よりも絵をみていただければよいのですが、
http://yamav102.cocolog-nifty.com/blog/2013/07/vba-friend-inst.html

Class のプロパティのInstancing を 「PublicNotCreateable」にして、相手のブックで、参照設定して、Classから呼び出すと、簡単に説明するとそうなるのですが、

昨日から、いろいろ検証してみたのですが、クラス・オブジェクトは、Public にすれば、Projects 間で簡単に融通が利くと思っていたのです。ところが、これでは、手数が多すぎます。これしかないのなら、やむを得ずおすすめしますが、アドインとして呼び出したほうが楽に扱えます。

ご質問者さんのは、ユーザー定義関数のスタイルですから、クラスを辞めて、標準モジュールに戻した後、ファイルをアドイン型(.xlam)で保存します。そして、アドインで呼び出した方が早いことが分かりました。

>VBAで、Functionを、クラスモジュールに置くか? 標準モジュールに置くか? 
結果としては、標準モジュールの方が良いということになりました。

なお、違うブックで、モジュールを共用して呼び出すなら、アドインにする必要もなく、VBEditor 内の相手のブック側で参照設定をすればよいです。

昨日に書いた内容は、間違っていました。申し訳ありません。

『ブック間をまたぐようなものに関しては、その利便性は発揮しますが、……』
実際にこちらでユーザー定義関数を作ってやってみました。実際にやるのは、たぶん、二度目ぐらいで、うっすらと記憶のある程度でした。

私の言葉の説明よりも絵をみていただければよいのですが、
http://yamav102.cocolog-nifty.com/blog/2013/07/vba-friend-inst.html

Class のプロパティのInstancing を 「PublicNotCreateable」にして、相手のブックで、参照設定して、...続きを読む

QexcelのFalseとTrue

添付図は赤の間違い個所を発見しようとするものです。
K列はあらかじめソートされており、同じものが続いています。
L列はK列に対する属性です。
従って、L399とL403は間違いで、これを発見しようとしています。
M列はM398を下へコピーしたもので、M400とM404はなぜTRUEとならないのでしょうか。
正と正が合わさると、虚になっています。

しかし、これが仕様なら間違い個所を発見する方法を考えてもらえませんか。
なお、ソフトはExcel2013、Win10です。

Aベストアンサー

>実際のデータは夫々E列、G列、K列となっています。
>マクロのKLMを単純にEGKに置き換えてよいでしょうか。

それでOKです。
"K"->"E"
"L"->"G"
"M"->"K"
に置き換えてください。
それで実行してみてください。

QVBA コンパイルエラーの解消法

皆様、いつもお世話になっております。
初心者なりに考えてVBAを組んでみたのですが、「Sub または Fanction が定義されていません」とエラー表示が出てきます。
自分なりにコードに間違いがないか検索ながらやってみたのですが、うまくいきません。

どなたか、知恵をお貸しいただけないでしょうか。



テーブルの入っているSheet1から、シート”施工体制台帳~”の該当するセルにデータのコピーを行うためのVBAです。
業者の数だけループするように組んだつもりなのですが、エラー表示のため実行ができません。
ご指摘、よろしくお願いいたします。

Sub kopipe1() '施工体制台帳
Dim sh As Worksheet
Dim sh1 As Worksheet
Dim sb As Long
Dim m As Long
Dim p As Long
Dim c As Long
Dim i As Long
Dim end1 As Long

Set sh = Worksheet("sheet1")
Set sh1 = Worksheet("施工体制台帳 (下請け) ")


end1 = sh.Range(".Cells(Rows.Count, 2)").End(xlUp)
sb = 1
p = 1

For i = 2 To end1 Step 1
sb = sb + 1
c = cell(p, 9)

sh.cell(sb, 2).Copy Destination:=.sh1.Range(c).Offset(2, 1) '会社名
sh.cell(sb, 3).Copy Destination:=.sh1.Range(c).Offset(2, 27) '代表者名
sh.cell(sb, 4).Copy Destination:=.sh1.Range(c).Offset(4, 1) '郵便番号
sh.cell(sb, 5).Copy Destination:=.sh1.Range(c).Offset(5, 1) '住所
sh.cell(sb, 6).Copy Destination:=.sh1.Range(c).Offset(6, 24) '電話番号
sh.cell(sb, 7).Copy Destination:=.sh1.Range(c).Offset(13) '業種1
sh.cell(sb, 8).Copy Destination:=.sh1.Range(c).Offset(14, 12) '許可者1
sh.cell(sb, 9).Copy Destination:=.sh1.Range(c).Offset(14, 15) '区分1
sh.cell(sb, 10).Copy Destination:=.sh1.Range(c).Offset(14, 17) '許可1-1
sh.cell(sb, 11).Copy Destination:=.sh1.Range(c).Offset(14, 20) '許可1-2
sh.cell(sb, 12).Copy Destination:=.sh1.Range(c).Offset(14, 27) '許可年月日
sh.cell(sb, 13).Copy Destination:=.sh1.Range(c).Offset(16) '業種2
sh.cell(sb, 14).Copy Destination:=.sh1.Range(c).Offset(17, 12) '許可者2
sh.cell(sb, 15).Copy Destination:=.sh1.Range(c).Offset(17, 15) '区分2
sh.cell(sb, 16).Copy Destination:=.sh1.Range(c).Offset(17, 17) '許可2-1
sh.cell(sb, 17).Copy Destination:=.sh1.Range(c).Offset(17, 20) '許可2-2
sh.cell(sb, 18).Copy Destination:=.sh1.Range(c).Offset(17, 27) '許可年月日2
sh.cell(sb, 19).Copy Destination:=.sh1.Range(c).Offset(21, 28) '健康保険
sh.cell(sb, 20).Copy Destination:=.sh1.Range(c).Offset(22, 28) '厚生年金保険
sh.cell(sb, 21).Copy Destination:=.sh1.Range(c).Offset(23, 28) '雇用保険
sh.cell(sb, 22).Copy Destination:=.sh1.Range(c).Offset(25, 3) '現場代理人指名
sh.cell(sb, 23).Copy Destination:=.sh1.Range(c).Offset(29, 7) '主任技術者氏名
sh.cell(sb, 24).Copy Destination:=.sh1.Range(c).Offset(31, 3) '資格内容
sh.cell(sb, 25).Copy Destination:=.sh1.Range(c).Offset(33, 3) '安全衛生責任者
sh.cell(sb, 26).Copy Destination:=.sh1.Range(c).Offset(25, 26) '安全衛生推進者
sh.cell(sb, 27).Copy Destination:=.sh1.Range(c).Offset(27, 26) '雇用管理責任者
sh.cell(sb, 28).Copy Destination:=.sh1.Range(c).Offset(29, 26) '専門技術者名
sh.cell(sb, 29).Copy Destination:=.sh1.Range(c).Offset(31, 26) '技術資格内容

p = p + 62
Exit For
Next i
End Sub

皆様、いつもお世話になっております。
初心者なりに考えてVBAを組んでみたのですが、「Sub または Fanction が定義されていません」とエラー表示が出てきます。
自分なりにコードに間違いがないか検索ながらやってみたのですが、うまくいきません。

どなたか、知恵をお貸しいただけないでしょうか。



テーブルの入っているSheet1から、シート”施工体制台帳~”の該当するセルにデータのコピーを行うためのVBAです。
業者の数だけループするように組んだつもりなのですが、エラー表示...続きを読む

Aベストアンサー

今のところ、変数に代入する以外のコードはほとんど間違っているわけですから、どれがどうと言えないと思います。
他の方との重複を含みます。
・Worksheet(---) ->Worksheets(----)
・sh.Range(".Cells(Rows.Count, 2)").End(xlUp)
  ↓
sh.Cells(Rows.Count, 2).End(xlUp).Row
・c = cell(p, 9)
  ↓
 c = Cells(p, 9) ただし、最後に、p = p + 62の後、Exit For では、1回キリでおしまいになってしまいます。

おそらくは、Dim c As String --Cells(p, 9).Address(0,0)
のはずです。
 
・sh.cell(sb, 2).Copy Destination:=.sh1.Range(c).Offset(2, 1) '会社名
とりあえず、Cells と sh1 のコンマは取るけれども、
sh1.Range(c).Offset(2, 1) これでは可読性を落とすばかりで分かりません。

これ自体を直すよりは、最初から作り直したほうが早そうです。
たぶん、一覧で横に並んでいるものを、別のシートの各場所に振り替えていくわけで、それが、ページごとになっているというわけでしょう。

まず、 sh1.cells(sb, 2).Copy ですが、
その列の2 を変数にすべきですね。

受ける側が、Offset で書かれてしまうと、手がつけられなくなってしまいます。

sh1.Range("J3,AJ3,J5,J6,AG7,I14,U15,X15,Z15,AC15,AJ15,I17," & _
 "U18,X18,Z18,AC18,AJ18,AK22,AK23,AK24,L26,P30,L32,L34," & _
 "AI26,AI28,AI30,AI32")

このようにまとめてしまい、以下のように纏めたものから呼び出すようにします。
しかし、実際にやってみると不具合が生じるので、それを配列で渡すようにします。

注:以下は、私の想像で書かれたものであって、実際に合っているのかは分かりません。
このようなスタイルにしてみたらという、あくでもこちらの提案です。

'//
Sub Test1()
 Dim Rng As Range
 Dim i As Long, j As Long, sb As Long
 Dim c As Variant
 Dim sh As Worksheet, sh1 As Worksheet
 Set sh = Worksheets("sheet1")
 Set sh1 = Worksheets("施工体制台帳 (下請け)")

 
 Set Rng = sh1.Range("J3,AJ3,J5,J6,AG7,I14,U15,X15,Z15,AC15,AJ15,I17," & _
 "U18,X18,Z18,AC18,AJ18,AK22,AK23,AK24,L26,P30,L32,L34," & _
 "AI26,AI28,AI30,AI32")
 
 end1 = sh.Cells(Rows.Count, 2).End(xlUp).row
 
 i = 2
 sb = 2
 For j = 1 To end1
 a = (j - 1) * 62 + 1
  For Each c In Rng.Offset((j - 1) * 62 + 1)
   c.Value = sh.Cells(sb, i).Value
   DoEvents
   i = i + 1
  Next
  i = 2
  sb = sb + 1
 Next
End Sub

今のところ、変数に代入する以外のコードはほとんど間違っているわけですから、どれがどうと言えないと思います。
他の方との重複を含みます。
・Worksheet(---) ->Worksheets(----)
・sh.Range(".Cells(Rows.Count, 2)").End(xlUp)
  ↓
sh.Cells(Rows.Count, 2).End(xlUp).Row
・c = cell(p, 9)
  ↓
 c = Cells(p, 9) ただし、最後に、p = p + 62の後、Exit For では、1回キリでおしまいになってしまいます。

おそらくは、Dim c As String --Cells(p, 9).Address(0,0)
のはずです。
 
・sh.cell(sb, 2).C...続きを読む

QExcel2010 複数条件のIf関数の組み方について

タイトルの内容を実施したいです。

言葉で伝えるのが難しい為、図を添付致しますのでご参照ください。
パラメータの空欄・値有により、パターンを自動付加する事をやりたいです。

E15-19セルで、B15-19、C15-19、D15-19に値を手入力し、その結果により、
パターンを自動付加させる関数をE15-19に埋め込みたいと考えています。
(どのようなパターンを自動付加させるかについては、パターン表(B4-E10)を参照する)

上記を実施したい場合、どのような関数を埋め込めば良いか、アドバイスを頂けませんでしょうか。
宜しくお願いいたします。

Aベストアンサー

こんにちは

お求めの関数式とは違うかも知れませんが・・・

E15に
 =INDEX({1,4,2,5,3,"",6,""},SUMPRODUCT((B15:D15<>"")*{4,2,1})+1)
としてフィルコピー。

ご提示のパターン表は参照していません。
式の最初のほうの『{1,4,2,5,3,"",6,""}』がパターン表に該当しています。

QExcelの計算式を教えてください

下記のような場合のExcelの式を教えて頂けますか?

下記のD列(D2~D4)セルを求める(入力)する式を教えてください。
B2~B4セルの手数料負担が「当方」の場合はA列「請求額」にC列「手数料」を合計し、D列「振込額」を求め、
B列の手数料負担が「先方」の場合は、A列「請求額」にC列「手数料」を減算し、D列セルの「振込額」を求める式を教えてください。

A1 請求額     B1 手数料負担  C1 手数料    D1 振込額  
A2  3,500円   B2  当方    C2  165(円)  D2 =式??  (3,665円)
A3  164,160   B3   先方    C3  258     D4 =式?? (163,902円)
A4  11,314   B4  先方    C4 165      D4 =式??  (11,149円)

Aベストアンサー

D2に
=IF(B2="当方",A2+C2,IF(B2="先方",A2-C2,""))

手数料負担が当方と先方の2種類しかなければ、
=IF(B2="当方",A2+C2,A2-C2)

QExcel VBAを使った複数重複行の抜き出しについて教えてください

以下のようなシートから、「郵便番号」の左から5桁(000-00)が20個以上重複しているsheet1の行を抜き出して、別シートに書き出したいと思っております。その時、重複数表示と郵便番号で並べ替えもしたいです。
全部で約10000行あります。(変動します)
VBAでのプログラムを教えて頂けないでしょうか。
初めての質問ですが、どうぞ宜しくお願い致します。

sheet1
   A    B      C     D    E
1 顧客コード 氏名   郵便番号   住所1  住所2
2 000123  〇〇  256-0000   〇〇県  1-3-5
3 000124  ▲□  258-3311   □▲県  2-6-9
3 000180  〇▲  258-3325   ●□県  3-8-2
3 000186  〇●  258-8236   〇■県  2-4-4
             ・
             ・ 
             ・
sheet2
   A      B
1 郵便番号  重複数
2 258-33   36
3 259-56   25
    ・
    ・
    ・

以下のようなシートから、「郵便番号」の左から5桁(000-00)が20個以上重複しているsheet1の行を抜き出して、別シートに書き出したいと思っております。その時、重複数表示と郵便番号で並べ替えもしたいです。
全部で約10000行あります。(変動します)
VBAでのプログラムを教えて頂けないでしょうか。
初めての質問ですが、どうぞ宜しくお願い致します。

sheet1
   A    B      C     D    E
1 顧客コード 氏名   郵便番号   住所1  住所2
2 000123  〇〇  256-0...続きを読む

Aベストアンサー

失礼します。

うまくいかない原因は、Excel のバグのようなものなので、CSVをインポートする時点で、郵便番号の部分などを、書式-文字列にしていますね。それが原因で、その部分を数式で参照すると、その書式文字列が伝染してしまいます。そうすると、計算ができませんから、その部分を参照する数式は使えません。

数式で郵便番号を参照しようとするなら、参照元の書式は文字列にしてはいけないのです。

以下は、それとはまったく関係のない配列の中での計算です。
並べ替えがないなら、Dictionary オブジェクトを使います。いわゆる連想配列です。並べ替えが必要のようですから、.NetFrameWork のオブジェクトを使ってみました。なお、このマクロは、Excel2003以上です。


標準モジュール
'//
Sub CountDouble()
 Dim DataList As Object
 Dim x
 Dim i As Long, j As Long
 Dim sh1 As Worksheet, sh2 As Worksheet
 Set sh1 = Worksheets("Sheet1")
 Set sh2 = Worksheets("Sheet2")

 Set DataList = CreateObject("System.Collections.SortedList")
 With sh1
  x = .Range("C2", .Cells(Rows.Count, 3).End(xlUp))
 End With
 For i = LBound(x) To UBound(x)
  If DataList.Contains(Left(x(i, 1), 6)) = False Then
   DataList.Add Left(x(i, 1), 6), 1
  Else
   DataList.Item(Left(x(i, 1), 6)) = DataList.Item(Left(x(i, 1), 6)) + 1
  End If
 Next i
 With sh2
  j = 2 '書き出し行
  .UsedRange.Clear
  .Activate
  .Cells(1, 1).Value = "郵便番号"
  .Cells(1, 2).Value = "重複数"
  For i = 0 To DataList.Count - 1
   If DataList.GetByIndex(i) > 19 Then '20個以上
   .Cells(j, 1).Value = DataList.getKey(i)
   .Cells(j, 2).Value = DataList.GetByIndex(i)
   j = j + 1
   End If
  Next i
 End With
 Set DataList = Nothing
End Sub

失礼します。

うまくいかない原因は、Excel のバグのようなものなので、CSVをインポートする時点で、郵便番号の部分などを、書式-文字列にしていますね。それが原因で、その部分を数式で参照すると、その書式文字列が伝染してしまいます。そうすると、計算ができませんから、その部分を参照する数式は使えません。

数式で郵便番号を参照しようとするなら、参照元の書式は文字列にしてはいけないのです。

以下は、それとはまったく関係のない配列の中での計算です。
並べ替えがないなら、Dictionary オブジェク...続きを読む

Qエクセルでマクロを使って別のシートのセルをコピーしたいのですがコピー先はマクロを実行した際のセルに指

エクセルでマクロを使って別のシートのセルをコピーしたいのですがコピー先はマクロを実行した際のセルに指定したいのですが、どうすれば出来ますか?
分かりやすく教えてください。

Aベストアンサー

このマクロは、経験のある人は少ないとは思いますが、プログラム的に言うと、マクロ*を一旦保留にするという意味ではないかと思います。作ってみたことはあります。
(*マクロの定義に反しますが。)

Sheet1 の A5 をマクロの起点として、Sheet2 なのか、Sheet3 なのか、どれかを選択して、範囲選択して、起点のセルをコピー&ペーストするという解釈です。

一見、Inputbox メソッドで使えるかと思ってやってみると、これがうまくいかないわけです。
ということで、UserForm をInputboxの代わりとして使うか、そんな所になるのではないかと思います。

ですが、文章を見る限りでは、マクロにお詳しくないわけで、そんな方に、実験的なマクロを提供しても、ゴミ同然になるかもしれません。

ショートカットは既存のもの以外なら、何でもよいと思います。
[現行では、Shift + Alt +c でコピー、Ctrl + Alt + v で ペースト]
何か指がつりそうな気がします。

これを、右クリックのマウスメニューに入れる方法もあります。

'//標準モジュール(本来は、個人用マクロブックに登録するのがよいのですが、
'//しかし、現行のマクロは、他のブックにはペースト出来ません。)

'Option Explicit 'モジュールの最上部から貼り付ける
Dim RngArea As String
Dim ShName As String
Dim WbName As String '現在は生きてはいない
Sub Auto_Open()
''ショートカット設定 '再起動で設定完了
Application.OnKey "%+c", "GetArea" 'Alt + Shift->c ''"%"..ALT,"+"..Shift, "^"..Ctrl
End Sub
Sub GetArea()
 If TypeName(Selection) = "Range" Then
  RngArea = Selection.Address(0, 0)
  ShName = Selection.Parent.Name
  WbName = Worksheets(ShName).Parent.Name
  Application.OnKey "^%v", "myPaste" 'Ctrl + Alt ->v
  Application.StatusBar = "..マクロ稼働中.."
  Beep
  
 End If
End Sub
Sub myPaste()
 Dim msgRet As VbMsgBoxResult
 If TypeName(Selection) <> "Range" Then Exit Sub
 If RngArea = "" Then Exit Sub
 msgRet = MsgBox("ここでよろしいですか?", vbInformation + vbYesNoCancel)
 If msgRet = vbYes Then
  Worksheets(ShName).Range(RngArea).Copy Selection
  If MsgBox("これでお終いですか?", vbInformation + vbYesNo + vbDefaultButton2) = vbYes Then
   GoTo EndLine
  End If
 ElseIf msgRet = vbCancel Then
  If MsgBox("範囲指定は消えます。", vbOKCancel) = vbOK Then
   GoTo EndLine
  End If
 End If
 Exit Sub
EndLine:
 Application.OnKey "^%v"  'キーの設定は消えます。
 Application.CutCopyMode = 0
 Application.StatusBar = False
 RngArea = ""
 ShName = ""
End Sub

範囲が決定した後の状態で、左下のステータスバーには、マクロ稼働中と出てきます。

このマクロは、経験のある人は少ないとは思いますが、プログラム的に言うと、マクロ*を一旦保留にするという意味ではないかと思います。作ってみたことはあります。
(*マクロの定義に反しますが。)

Sheet1 の A5 をマクロの起点として、Sheet2 なのか、Sheet3 なのか、どれかを選択して、範囲選択して、起点のセルをコピー&ペーストするという解釈です。

一見、Inputbox メソッドで使えるかと思ってやってみると、これがうまくいかないわけです。
ということで、UserForm をInputboxの代わりとして使うか、そ...続きを読む

Qエクセルを私が開くと日付の表示がおかしくなる(他の人は問題なし)

会社でエクセルファイルを私が開くと日付の表示がおかしくなります。(他の人は問題ないです)

具体的には、平成○年○月○日という表示されるよう設定されファイル作成されているはずが、
私が開くと○月○日平成○○年と表示されます。

このようなファイルが一つではありませんので、私のPCでの「エクセル」の設定がおかしいのかと。

勿論、毎度毎度、気が付く度に手作業で直せますが、根本的にリセットしたいです。
気が付かないで印刷し取引先に送ったら注意を受けてしまいました。

原因・修正にお心当たりの方、ご教示の程宜しくお願い致します。

Aベストアンサー

参考になりますかね
https://oshiete.goo.ne.jp/qa/2408312.html
https://matome.naver.jp/odai/2141732667925396001

QVBAで、文字列の中に文字列挿入

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1162902186
上記URLで解説がしてあったのですが、理解できませんでした。

A列に、文字列があり、””の中に、B列の文字を挿入したいと考えています。
A列の文字列は、3000行にわたり、すべて同じで、全ての””の中に、B列のランダムなセルの全文字を挿入したいと考えています。

A1
html img src="" alt div この文字列が3000行にわたり、全て入っており、
B1
http://drowoutclass.co.jp
B列には、上記のようなURLがランダムに違った値で5000行に入っています。

A1の””には、B1の文字列が入り、
A2の””には、B2の文字列が入る
というふうに、5000行までの処理をVBAで一挙に行いたいのですが....

アドバイスお願いいたします。

Aベストアンサー

ダブルクォーテーションの扱いがちょっと詰まるかもしれませんが,
A列がすべて同じなら,VBAを使うまでもないですね.

A1に以下を入れてEnter
="html img src=""" & B1 & """ alt div"
あとはオートフィルなどで.

-----------------
もしVBAでやるとしても,以下のような感じかな

Sub testes()
Dim i As Long
For i = 1 To 5000
Cells(i, "A") = "html img src=""" & Cells(i, "B") & """ alt div"
Next i
End Sub


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング