用自定义的CCheckComboBox类做带复选框的下拉列表
1、添加Combo Box控件
2.、改属性Style:DropList ;Owner Draw:Fixed ;Has string:true ;Sort:false
3、头文件中添加:
CCheckComboBox m_comboBox;
4、DoDataExchange(CDataExchange* pDX)中添加:
DDX_Control(pDX, IDC_COMBO1, m_comboBox);
5、对话框初始化时添加
m_comboBox.AddString(_T("1"));//加入项目
m_comboBox.AddString(_T("2"));
m_comboBox.AddString(_T("3"));
m_comboBox.AddString(_T("4"));
m_comboBox.SetCheck(0, TRUE);//设置选择状态
m_comboBox.SetCheck(1, FALSE);
m_comboBox.SetCheck(2, TRUE);
m_comboBox.SetCheck(3, TRUE);
#if !defined(AFX_CHECKCOMBOBOX_H__66750D93_95DB_11D3_9325_444553540000__INCLUDE D_)
#define AFX_CHECKCOMBOBOX_H__66750D93_95DB_11D3_9325_444553540000__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CCheckComboBox : public CComboBox
{
public:
CCheckComboBox();
virtual ~CCheckComboBox();
BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
// Selects all/unselects the specified item
INT SetCheck(INT nIndex, BOOL bFlag);
// Returns checked state
BOOL GetCheck(INT nIndex);
// Selects all/unselects all
void SelectAll(BOOL bCheck = TRUE);
protected:
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CCheckComboBox)
protected:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
//}}AFX_VIRTUAL
//{{AFX_MSG(CCheckComboBox)
afx_msg LRESULT OnCtlColorListBox(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnGetText(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnGetTextLength(WPARAM wParam, LPARAM lParam);
afx_msg void OnDropDown();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
public:
CString m_strText;
protected:
// Routine to update the text
void RecalcText();
// The subclassed COMBOLBOX window (notice the 'L')
HWND m_hListBox;
// The string containing the text to display
BOOL m_bTextUpdated;
// A flag used in MeasureItem, see comments there
BOOL m_bItemHeightSet;
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif
// !defined(AFX_CHECKCOMBOBOX_H__66750D93_95DB_11D3_9325_444553540000__INCLUDED _)
/** CheckComboBox.cpp **/
// CheckComboBox.cpp
//
// Written by Magnus Egelberg (magnus.egelberg@lundalogik.se)
//
// Copyright (C) 1999, Lundalogik AB, Sweden. All rights reserved.
//
//
#include "stdafx.h"
// #include "CheckCombo.h"
#include "CheckComboBox.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static WNDPROC m_pWndProc = 0;
static CCheckComboBox *m_pComboBox = 0;
BEGIN_MESSAGE_MAP(CCheckComboBox, CComboBox)
//{{AFX_MSG_MAP(CCheckComboBox)
ON_MESSAGE(WM_CTLCOLORLISTBOX, OnCtlColorListBox)
ON_MESSAGE(WM_GETTEXT, OnGetText)
ON_MESSAGE(WM_GETTEXTLENGTH, OnGetTextLength)
ON_CONTROL_REFLECT(CBN_DROPDOWN, OnDropDown)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//
// The subclassed COMBOLBOX message handler
//
extern "C" LRESULT FAR PASCAL ComboBoxListBoxProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
switch (nMsg) {
case WM_RBUTTONDOWN: {
// If you want to select all/unselect all using the
// right button, remove this ifdef. Personally, I don't really like it #if FALSE
if (m_pComboBox != 0) {
INT nCount = m_pComboBox->GetCount();
INT nSelCount = 0;
for (INT i = 0; i < nCount; i++) {
if (m_pComboBox->GetCheck(i))
nSelCount++;
}
m_pComboBox->SelectAll(nSelCount != nCount);
// Make sure to invalidate this window as well
InvalidateRect(hWnd, 0, FALSE);
m_pComboBox->GetParent()->SendMessage(WM_COMMAND,
MAKELONG(GetWindowLong(m_pComboBox->m_hWnd, GWL_ID), CBN_SELCHANGE), (LPARAM)m_pComboBox->m_hWnd);
}
#endif
break;
}
// Make the combobox always return -1 as the current selection. This
// causes the lpDrawItemStruct->itemID in DrawItem() to be -1
// when the always-visible-portion of the combo is drawn
case LB_GETCURSEL: {
return -1;
}
case WM_CHAR: {
if (wParam == VK_SPACE) {
// Get the current selection
INT nIndex = CallWindowProcA(m_pWndProc, hWnd, LB_GETCURSEL, wParam, lParam);
CRect rcItem;
SendMessage(hWnd, LB_GETITEMRECT, nIndex, (LONG)(VOID *)&rcItem);
InvalidateRect(hWnd, rcItem, FALSE);
// Invert the check mark
m_pComboBox->SetCheck(nIndex, !m_pComboBox->GetCheck(nIndex));
// Notify that selection has changed
m_pComboBox->GetParent()->SendMessage(WM_COMMAND,
MAKELONG(GetWindowLong(m_pComboBox->m_hWnd, GWL_ID), CBN_SELCHANGE), (LPARAM)m_pComboBox->m_hWnd);
return 0;
}
break;
}
case WM_LBUTTONDOWN: {
CRect rcClient;
GetClientRect(hWnd, rcClient);
CPoint pt;
pt.x = LOWORD(lParam);
pt.y = HIWORD(lParam);
if (PtInRect(rcClient, pt)) {
INT nItemHeight = SendMessage(hWnd, LB_GETITEMHEIGHT, 0, 0);
INT nTopIndex = SendMessage(hWnd, LB_GETTOPINDEX, 0, 0);
// Compute which index to check/uncheck
INT nIndex = nTopIndex + pt.y / nItemHeight;
CRect rcItem;
SendMessage(hWnd, LB_GETITEMRECT, nIndex, (LONG)(VOID *)&rcItem);
if (PtInRect(rcItem, pt)) {
// Invalidate this window
InvalidateRect(hWnd, rcItem, FALSE);
m_pComboBox->SetCheck(nIndex, !m_pComboBox->GetCheck(nIndex));
// Notify that selection has changed
m_pComboBox->GetParent()->SendMessage(WM_COMMAND,
MAKELONG(GetWindowLong(m_pComboBox->m_hWnd, GWL_ID), CBN_SELCHANGE), (LPARAM)m_pComboBox->m_hWnd);
}
}
// Do the default handling now (such as close the popup
// window when clicked outside)
break;
}
case WM_LBUTTONUP: {
// Don't do anything here. This causes the combobox popup
// windows to remain open after a selection has been made
return 0;
}
}
return CallWindowProc(m_pWndProc, hWnd, nMsg, wParam, lParam);
}
CCheckComboBox::CCheckComboBox()
{
m_hListBox = 0;
m_bTextUpdated = FALSE;
m_bItemHeightSet = FALSE;
}
CCheckComboBox::~CCheckComboBox()
{
}
BOOL CCheckComboBox::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)
{
// Remove the CBS_SIMPLE and CBS_DROPDOWN styles and add the one I'm designed for dwStyle &= ~0xF;
dwStyle |= CBS_DROPDOWNLIST;
// Make sure to use the CBS_OWNERDRAWVARIABLE style
dwStyle |= CBS_OWNERDRAWVARIABLE;
// Use default strings. We need the itemdata to store checkmarks
dwStyle |= CBS_HASSTRINGS;
return CComboBox::Create(dwStyle, rect, pParentWnd, nID);
}
LRESULT CCheckComboBox::OnCtlColorListBox(WPARAM wParam, LPARAM lParam)
{
// If the listbox hasn't been subclassed yet, do so...
if (m_hListBox == 0) {
HWND hWnd = (HWND)lParam;
if (hWnd != 0 && hWnd != m_hWnd) {
// Save the listbox handle
m_hListBox = hWnd;
// Do the subclassing
m_pWndProc = (WNDPROC)GetWindowLong(m_hListBox, GWL_WNDPROC);
SetWindowLong(m_hListBox, GWL_WNDPROC, (LONG)ComboBoxListBoxProc);
}
}
return DefWindowProc(WM_CTLCOLORLISTBOX, wParam, lParam);
}
void CCheckComboBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) {
HDC dc = lpDrawItemStruct->hDC;
CRect rcBitmap = lpDrawItemStruct->rcItem;
CRect rcText = lpDrawItemStruct->rcItem;
CString strText;
// 0 - No check, 1 - Empty check, 2 - Checked
INT nCheck = 0;
// Check if we are drawing the static portion of the combobox
if ((LONG)lpDrawItemStruct->itemID < 0) {
// Make sure the m_strText member is updated
RecalcText();
// Get the text
strText = m_strText;
// Don't draw any boxes on this item
nCheck = 0;
}
// Otherwise it is one of the items
else {
GetLBText(lpDrawItemStruct->itemID, strText);
nCheck = 1 + (GetItemData(lpDrawItemStruct->itemID) != 0);
TEXTMETRIC metrics;
GetTextMetrics(dc, &metrics);
rcBitmap.left = 0;
rcBitmap.right = rcBitmap.left + metrics.tmHeight + metrics.tmExternalLeading + 6;
rcBitmap.top += 1;
rcBitmap.bottom -= 1;
rcText.left = rcBitmap.right;
}
if (nCheck > 0) {
SetBkColor(dc, GetSysColor(COLOR_WINDOW));
SetTextColor(dc, GetSysColor(COLOR_WINDOWTEXT));
UINT nState = DFCS_BUTTONCHECK;
if (nCheck > 1)
nState |= DFCS_CHECKED;
// Draw the checkmark using DrawFrameControl
DrawFrameControl(dc, rcBitmap, DFC_BUTTON, nState);
}
if (lpDrawItemStruct->itemState & ODS_SELECTED) {
SetBkColor(dc, GetSysColor(COLOR_HIGHLIGHT));
SetTextColor(dc, GetSysColor(COLOR_HIGHLIGHTTEXT));
}
else {
SetBkColor(dc, GetSysColor(COLOR_WINDOW));
SetTextColor(dc, GetSysColor(COLOR_WINDOWTEXT));
}
// Erase and draw
ExtTextOut(dc, 0, 0, ETO_OPAQUE, &rcText, 0, 0, 0);
DrawText(dc, ' ' + strText, strText.GetLength() + 1, &rcText,
DT_SINGLELINE|DT_VCENTER|DT_END_ELLIPSIS);
if ((lpDrawItemStruct->itemState & (ODS_FOCUS|ODS_SELECTED)) ==
(ODS_FOCUS|ODS_SELECTED))
DrawFocusRect(dc, &rcText);
}
void CCheckComboBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) {
CClientDC dc(this);
CFont *pFont = dc.SelectObject(GetFont());
if (pFont != 0) {
TEXTMETRIC metrics;
dc.GetTextMetrics(&metrics);
lpMeasureItemStruct->itemHeight = metrics.tmHeight +
metrics.tmExternalLeading;
// An extra height of 2 looks good I think.
// Otherwise the list looks a bit crowded...
lpMeasureItemStruct->itemHeight += 2;
// This is needed since the WM_MEASUREITEM message is sent before // MFC hooks everything up if used in i dialog. So adjust the
// static portion of the combo box now
if (!m_bItemHeightSet) {
m_bItemHeightSet = TRUE;
SetItemHeight(-1, lpMeasureItemStruct->itemHeight);
}
dc.SelectObject(pFont);
}
}
//
// Make sure the combobox window handle is updated since
// there may be many CCheckComboBox windows active
//
void CCheckComboBox::OnDropDown()
{
m_pComboBox = this;
}
//
// Selects/unselects all items in the list
//
void CCheckComboBox::SelectAll(BOOL bCheck)
{
INT nCount = GetCount();
for (INT i = 0; i < nCount; i++)
SetCheck(i, bCheck);
}
//
// By adding this message handler, we may use CWnd::GetText()
//
LRESULT CCheckComboBox::OnGetText(WPARAM wParam, LPARAM lParam) {
// Make sure the text is updated
RecalcText();
if (lParam == 0)
return 0;
// Copy the 'fake' window text
lstrcpyn((LPWSTR)lParam, m_strText, (INT)wParam);
return m_strText.GetLength();
}
//
// By adding this message handler, we may use CWnd::GetTextLength() //
LRESULT CCheckComboBox::OnGetTextLength(WPARAM, LPARAM)
{
// Make sure the text is updated
RecalcText();
return m_strText.GetLength();
}
//
// This routine steps thru all the items and builds
// a string containing the checked items
//
void CCheckComboBox::RecalcText()
{
if (!m_bTextUpdated) {
CString strText;
// Get the list count
INT nCount = GetCount();
// Get the list separator
TCHAR szBuffer[10] = {0};
GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SLIST, szBuffer, sizeof(szBuffer));
CString strSeparator = szBuffer;
// If none found, the the ';'
if (strSeparator.GetLength() == 0)
strSeparator = ';';
// Trim extra spaces
strSeparator.TrimRight();
// And one...
strSeparator += ' ';
for (INT i = 0; i < nCount; i++) {
if (GetItemData(i)) {
CString strItem;
GetLBText(i, strItem);
if (!strText.IsEmpty())
strText += strSeparator;
strText += strItem;
}
}
// Set the text
m_strText = strText;
m_bTextUpdated = TRUE;
}
}
INT CCheckComboBox::SetCheck(INT nIndex, BOOL bFlag)
{
INT nResult = SetItemData(nIndex, bFlag);
if (nResult < 0)
return nResult;
// Signal that the text need updating
m_bTextUpdated = FALSE;
// Redraw the window
Invalidate(FALSE);
return nResult;
}
BOOL CCheckComboBox::GetCheck(INT nIndex) {
return GetItemData(nIndex);
}
excel表格中如何设置下拉菜单 一、直接自定义序列 用“数据/有效性”功能可以达到目的。 以选择性别为例,制作有男、女选项的下拉菜单: 选中“性别”数据区域; 执行“数据/有效性”命令,打开“数据有效性”对话框; 单击“设置”选项卡,在“允许”栏选择“序列”,“来源”中输入“男,女”(不含引号,用英文单引号分隔); 单击“确定”按钮。 二、利用表内数据作为序列源 有时候序列值较多,直接在表内打印区域外把序列定义好,然后引用。 操作步骤:先在同一工作表内的打印区域外要定义序列填好(假设在在Z1:Z3),如“男,女,其他”,然后选择要实现效果的列,再点击"数据\有效性",打开"数据有效性"对话框;选择"设置"选项卡,在"允许"下拉菜单中选择"序列",“来源”栏点击右侧的展开按钮(有一个红箭头),用鼠标拖动滚动条,选中序列区域Z1:Z3(可以直接输入=$Z$1:$Z$8;选上"忽略空值"和"提供下拉菜单"两个复选框。点击"输入信息"选项卡,选上"选定单元格显示输入信息",在"输入信息"中输入"请在这里选择"。 三、横跨两个工作表来制作下拉菜单 方法:用INDIRECT函数实现跨工作表 在sheet2中在Z1:Z3处设置好数据源:男,女,其他 选择要实现效果的列,再点击"数据\有效性",打开"数据有效性"对话框;选择"设置"选项卡,在"允许"下拉菜单中选择"序列",在来源处换成=INDIRECT("sheet2!$i$8:$i$12"), 就可实现横跨两个工作表来制作下拉菜单。 Excel设置数据有效性实现单元格下拉菜单的3种方法 一、直接输入: 1.选择要设置的单元格,譬如A1单元格; 2.选择菜单栏的“数据”→“有效性”→出现“数据有效性”弹出窗口; 3.在“设置”选项中→“有效性条件”→“允许”中选择“序列”→右边的“忽略空值”和“提供下拉菜单”全部打勾→在“来源”下面输入数据,譬如“1,2,3,4,5,6,7,8,9”(不包括双引号,分割符号“,”必须为半角模式)→按“确定”就OK了,再次选择该A1单元格,就出现了下拉菜单。 二、引用同一工作表内的数据: 如果同一工作表的某列就是下拉菜单想要的数据,譬如引用工作表Sheet1的B2:B5,B2:B5分别有以下数据:1、2、3、4,操作如下: 1.选择要设置的单元格,譬如A1单元格; 2.选择菜单栏的“数据”→“有效性”→出现“数据有效性”弹出窗口; 3.在“设置”选项中→“有效性条件”→“允许”中选择“序列”→右边的“忽略空值”和“提供下拉菜单”全部打勾→在“来源”下面输入数据“=$B$2:$B$5”,也可以按右边带红色箭头的直接选择B2:B5区域→按“确定”就OK了,再次选择该A1单元格,就出现了下拉菜单。 三、引用不同工作表内的数据(必须用到定义名称): 如果不同工作表的某列就是下拉菜单想要的数据,譬如工作表Sheet1的A1单元格要引用工作表Sheet2的B2:B5区域,工作表Sheet2的B2:B5分别有以下数据:1、2、3、4,操作如下: 1.定义名称:菜单栏→“插入”→“名称”→“定义”→弹出“定义名称”窗口,在“在当前工作薄中
Excel表格制作分类下拉列表 在平日的工作中,为节省输入的时间及减少输入错误,经常看到并且使用Excel表格的下拉列表。那么Excel表格的下拉列表是怎样创建的呢? 相关阅读 Excel2003制作分类下拉列表填充项全攻略(动画教程) Excel表格制作二级下拉菜单全步骤 Excel2003视频教程:设定序列下拉箭头 Excel2010视频教程:16、通过下拉列表快速输入数据 本例中,如果你在乡镇选项栏选择开发区, 在学校名称下拉列表仅显示开发区学校名称;如果你在乡镇选项栏选择城关镇, 在学校名称下拉列表仅显示城关镇学校名称……操作步骤如下: 第一步:建库 启动Excel2003,切换到Sheet2工作表(其他工作表也可)中,将学校名称按乡镇分别输入不同列的单元格中,建立一个学校名称数据库。 提示:如果有其他新增加的学校名称,可以随时将名称输入到该列下面的单元格中。
第二步:命名 在Sheet2工作表中,选中A列(开发区学校名称所在列),然后将光标定在“名称”栏内(位于“编辑栏”左侧),输入“开发区”,并按“回车”键进行确认。
仿照上面的操作,将B、C、D列分别命名为“城关镇”、“城北乡”、“刘集乡”。
第三步:建立 切换到Sheet1工作表中,选中需要输入乡镇的单元格(如K4单元格),执行“数据→有效性”命令,打开“数据有效性”对话框。进入“设置”标签,单击“允许”右侧的下拉按钮,选中“序列”选项,在下面接着出现的“来源”方框中,输入“开发区、城关镇、城北乡、刘集乡……”序列,输入完成后,确定退出。
提示:在输入“序列”时,序列中各元素之间请用英文状态下的逗号隔开。 再选中需要输入学校名称的单元格(如C3单元格),再次打开“数据有效性”对话框,选中“序列”选项后,在“来源”方框中输入公式:=INDIRECT(K4),确定退出。 提示:如果点确定出现错误提示:“目前源出现错误。是否继续?”不要管它,点击“是”即可,是因为K4单元格目前没有数据。
Excel表格制作二级下拉菜单全步骤 通过2级菜单,倒是可以比较深入熟悉INDIRECT, INDEX, OFFSET, 这三个函数,是你要想学excel函数,估计你肯定过的关。 不过二级菜单的第一级的做法,都是相同的,大家可以参考上面的文章创建一个一级菜单。 第一种做法:使用函数INDIRECT 看看例子 很明显,我们希望在一级选择机房故障,那么2级就出现他下面的列表。 要实现这个目标并不复杂。 1:建立“名称” 3个一级选项,我们需要建立3个“名称”:机房故障线路故障用户端故障。 这个时候,你就创建了3个名称
还需要建立一个名称,叫做“故障类型”这个名称包括“机房故障线路故障用户端故障”这3项。
这个时候,你就可以在“名称管理器”看到4个名称2:创建1级菜单 1级菜单的办法就简单了 这样就解决了一级的下拉菜单。 3:2级菜单
这个地方你需要注意,=INDIRECT($F2) 如果你写成=INDIRECT($F$2), 如果是这样的话,你确定会出现一个报错这个时候,你就实现了2级菜单
第二种做法:使用函数INDEX 还是上面的例子,用另外一种方式来实现。这个例子里,你只需要建立2个名称。 1:建立名称 建立:故障类型名称,方法和上面一样。 建立:2级名称
创建上面两个名称。 2:创建下拉菜单 第一下拉菜单和上面一样,我就不重复了,现在是演示第二级下拉菜单 =INDEX(二级,0,match(I$2,故障类型,0)) 这样你就搞定2级菜单里。 第三种做法:使用函数OFFSET 学这个offset函数半天,才搞定。现在只是可以实现这个功能。不过还有需要改进的地方 还是上面的例子,
Excel设置数据有效性实现单元格下拉菜单的3种方法 一、直接输入: 1.选择要设置的单元格,譬如A1单元格; 2.选择菜单栏的“数据”→“有效性”→出现“数据有效性”弹出窗口; 3.在“设置”选项中→“有效性条件”→“允许”中选择“序列”→右边的“忽略空值”和“提供下拉菜单”全部打勾→在“来源”下面输入数据,譬如“1,2,3,4,5,6,7,8,9”(不包括双引号,分割符号“,”必须为半角模式)→按“确定”就OK了,再次选择该A1单元格,就出现了下拉菜单。 二、引用同一工作表内的数据: 如果同一工作表的某列就是下拉菜单想要的数据,譬如引用工作表Sheet1的B2:B5,B2:B5分别有以下数据:1、2、3、4,操作如下: 1.选择要设置的单元格,譬如A1单元格; 2.选择菜单栏的“数据”→“有效性”→出现“数据有效性”弹出窗口; 3.在“设置”选项中→“有效性条件”→“允许”中选择“序列”→右边的“忽略空值”和“提供下拉菜单”全部打勾→在“来源”下面输入数据“=$B$2:$B$5”,也可以按右边带红色箭头的直接选择B2:B5区域→按“确定”就OK了,再次选择该A1单元格,就出现了下拉菜单。 三、引用不同工作表内的数据(必须用到定义名称): 如果不同工作表的某列就是下拉菜单想要的数据,譬如工作表Sheet1的A1单元格要引用工作表Sheet2的B2:B5区域,工作表Sheet2的B2:B5分别有以下数据:1、2、3、4,操作如下: 1.定义名称:菜单栏→“插入”→“名称”→“定义”→弹出“定义名称”窗口,在“在当前工作薄中的名称”下面输入“DW”(可以自己随便明明)→“引用位置”下面输入“=Sheet2!$B$2:$B$5”,也可以按右边带红色箭头的直接选择B2:B5区域→按“添加”后再按“确定”完成第一步。 2.选择菜单栏的“数据”→“有效性”→出现“数据有效性”弹出窗口; 3.在“设置”选项中→“有效性条件”→“允许”中选择“序列”→右边的“忽略空值”和“提供下拉菜单”全部打勾→在“来源”下面输入“=DW”,“DW”就是刚刚定义好的名称,按“确定”就OK了,再次选择该A1单元格,就出现了下拉菜单。
在Excel中实现下拉列表 注:以下示例在Microsoft Excel 2007中通过测试 一、直接输入: 1.选择要设置的单元格,例如A1单元格; 2.选择菜单栏的“数据”→“数据有效性”→出现“数据有效性”弹出窗口; 3.在“设置”选项卡中→“有效性条件”→“允许”中选择“序列”→右边的“忽略空值”和“提供下拉箭头”全部打勾→在“来源”下面输入数据,如“部门1,部门2,部门3,部门4,部门5”(不包括双引号,分割符号“,”必须为半角模式)→点击“确定”完成,再次选择该A1单元格,就出现了下拉菜单。当然,可以拖动单元格扩展填充序列。 如图所示: 二、引用同一工作表内的数据:
如果同一工作表的某列区域就是下拉菜单想要的数据,例如引用工作表Sheet1的B1:B5。B1:B5分别有以下数据:部门1、部门2、部门3、部门4、部门5,操作如下: 1.选择要设置的单元格,例如A1单元格; 2.选择菜单栏的“数据”→“数据有效性”→出现“数据有效性”弹出窗口; 3.在“设置”选项卡中→“有效性条件”→“允许”中选择“序列”→右边的“忽略空值”和“提供下拉菜单”全部打勾→在“来源”下面输入数据 “=$B$1:$B$5”,也可以直接点击单元格选择B1:B5区域→按“确定”完成,再次选择该A1单元格,就出现了下拉菜单。 如图所示: 三、引用不同工作表内的数据(必须为引用的区域定义名称): 如果不同工作表的某列区域就是下拉菜单想要的数据,譬如工作表Sheet1的A1单元格要引用工作表Sheet2的A1:A5区域。工作表Sheet2的A1:A5分别有以下数据:部门1、部门2、部门3、部门4、部门5,操作如下: 1. 为引用单元格区域定义名称:
Excel电子表格下拉菜单的制作 小伙伴在制作电子表格时候,经常会看到单元格中的向下箭头,单击某个单元格,会出现一个向下显示的选框供我们直接选择填入,可以提高我们的录入速度。如下图,A、B、C列都有下拉箭头,当我们在A列选择不同的项目,B列下拉菜单列示该项目所有子项,在B列选择某个具体项目后,C列又会出现B列选中项目的所有子项。 下面给大家讲讲具体的实现过程: 第一步、定义名称: 首先在某个工作表上列出具体的分类,如图: 然后选中整个区域,单击“开始\编辑”选项卡中查找和替换\定位条件按钮,打开选项卡:
在选项卡中选中“常量”选项,单击“确定”按钮,定位所有有文字的单元格: 此时不要在工作表中单击鼠标(以免选好的区域发生变化),单击“公式”选项卡\定义名称中“根据所选内容创建”按钮:
选中“最左列”复选框,单击确定按钮,完成自定义名称的创建。
创建好的名称如下: 名称定义好之后,以后还可以根据需要修改、删除现有的名称,也可以新建新的名称。 第二步、设置数据有效性: 选中A列,单击“数据”选项卡\数据有效性按钮,打开数据有效性对话框,允许框选中“序列”,来源框输入“=学科”(上一步定义好的名称),勾选“忽略空值”和“提供下拉箭头”复选框:
单击“确定”按钮完成A列下拉菜单的设置: 选中B列,单击“数据”选项卡\数据有效性按钮,打开数据有效性对话框,允许框选中“序列”,来源框输入“=indirect(a1)”,勾选“忽略空值”和“提供下拉箭头”复选框。indirect(a1)是引用A1单元格的意思。
单击确定按钮,完成B列下拉菜单的设置: 选中C列,单击“数据”选项卡\数据有效性按钮,打开数据有效性对话框,允许框选中“序列”,来源框输入“=indirect(b1)”,勾选“忽略空值”和“提供下拉箭头”复选框。 单击确定按钮,完后C列下拉菜单的设置: OK整个A、B、C列下拉菜单设置完成。
在Excel中制作下拉列表的三种方法 下拉列表在Excel中的用途十分广泛。在Excel中制作下拉列表可以通过数据有效性、使用窗体控件和VBA控件工具箱中的组合框来制作。下面用一个具体的例子来进行说明(在文章结尾处可下载xls格式的示例文件)。假如每个月都有一个工资表,其中每个员工的工资按照其出勤天数每个月都不相同。 需要制作一个“个人工资表”来查看每个人每个月的工资情况,这时就可以制作一个包含员工姓名下拉列表,在其中进行选择来查看指定员工每个月的工资情况。 本文图文介绍了在Excel中制作下拉列表的三种方法。 方法一:使用数据有效性 通过数据有效性可以在单元格中提供一个下拉箭头,单击下拉箭头会弹出下拉列表。因为员工姓名都在每月的工资表中,而“个人工资表”中没有这些人员姓名,所以必需先定义名称,以便在“个人工资表”中设置数据有效性时进行引用。
定义名称的方法是单击菜单“插入→名称”,在定义名称对话框中进行定义,这里将“1月工资”表中的姓名区域B3:B14定义为“姓名”,如图。 1、假如下拉列表放在“个人工资表”的C1单元格,选择C1单元格,然后单击菜单“数据→有效性”,选择“设置”选项卡,在“有效性条件”区域中“允许”下方的下拉列表中选择“序列”。 2、在“来源”下方的文本框中输入“=姓名”。单击“确定”。 3、在数据区C3:H14中用VLOOKUP函数对工资数据进行关联。例如第3行为1月工资,可以在C3单元格中输入公式 =VLOOKUP($C$1,'1月工资'!$B$3:$H$14,2,0)” 在D3单元格中输入公式: =VLOOKUP($C$1,'1月工资'!$B$3:$H$14,3,0)
excel2010二级下拉菜单的制作方法 Excel中如何制作二级下拉菜单呢?下面是由学习啦小编分享的excel2010二级下拉菜单的制作方法,以供大家阅读和学习。 excel2010二级下拉菜单的制作方法: 二级下拉菜单制作步骤1:首先在excel中做好省市工作簿,选中省市内容部分后,按下键盘上快捷键:Ctrl+G,在弹出的定位对话框中点击红圈圈住的“定位条件”,如下图: 二级下拉菜单制作步骤2:这时候会再弹出一个条件选择对话框,选择常量后点击确定即可,如下图:
二级下拉菜单制作步骤3:接着点击excel上方的公式菜单,选择【根据所选的内容创建】,在弹出的对话框中选择“首行”并确定,如下图: 二级下拉菜单制作步骤4:然后点击下方的+按钮创建一个新工作表sheet2,在新工作表中设置第一行为省份与城市,这一步比较简单,就不截图了。 二级下拉菜单制作步骤5:接着选择省份下方的单元格,选择excel上方的【数据】菜单,然后点击数据验证,在弹出的对话框中选择允许为:序列,将光标定于来源框中,接着点击工作表sheet1,选择首行的省份,然后点击确定,如下图:
二级下拉菜单制作步骤6:这时候已经完成一大步了,省份的效果已经出来了,将光标放在省份下的单元格即可看到下拉菜单,如图:
二级下拉菜单制作步骤7:下面开始来制作城市部分,方法同省份的方法大体一致,选择某个省份如江西省后,选择城市下方的单元格,点击【数据】>>【数据验证】,在弹出的对话框中同样选择序列,来源框内填写:=INDIRECT($A2),然后点击确定,这时候不仅城市的效果出来了,二级联动的效果也出来了,选择相应的省份对应的城市也会出来了。
EXCEL怎么做2级下拉菜单啊? 比如:分2大类,有“水果”和“蔬菜”,水果里分“苹果”和“桔子”,蔬菜里分“青菜”和“黄瓜”。一栏里如果选了“水果”,那么另一栏只能选“苹果”或“桔子”。要是选了“蔬菜”,那么另一栏就只能选“青菜”或“黄瓜”。 答案 先做张基础表 全选A列,在名称框输入“大类”两字,将A列取名“大类”, 再将C列取名水果,D列取名蔬菜…… 在A列输入水果、蔬菜……(注意,输入的类别一定要和后面列的名称相同,实质上输入的是后面各列的名称) 在C列输入苹果、橘子…… 在D列输入青菜、黄瓜…… 进正式表A2,数据/有效性,在来源中输入 =INDIRECT("大类") 在B2,数据/有效性,在来源中输入 =INDIRECT(A2) 再将A2和B2单元格分别下拉即可 再有不明白可发消息 其他回答 需要一个辅助表(假定为SHEET1),在A列输入“苹果”和“桔子”等所有水果名;在B列输入“青菜”和“黄瓜”等所有蔬菜名。 另一个是你要建立二级下拉菜单的表(假定为SHEET2),假定A1为一级菜单,内容为“水果”和“蔬菜”,先用数据->有效性设置好。B1单元格为对应的二级菜单。 在SHEET1工作表的C1单元格输入公式: =IF(Sheet2!A$1="水果",A1,IF(Sheet2!A$1="蔬菜",B1,"")) 将公式向下复制。 用鼠标选定C列,在“名称”栏(左上角显示C1的地方)输入“类别”(不含引号)。 单击SHEET2工作表B1单元格,点"数据"->"有效性"->"设置",在"允许"下面选择"序列",在"来源"框中输入: =类别 点"确定"。
Excel 二级下拉菜单的3种方法 把excelhome的论坛关于下拉菜单的贴看了不少。发现实现2级的下拉菜单的方法好像也有好几种,我想我就做一个总结,自己也提高一下。 通过2级菜单,倒是可以比较深入熟悉 INDIRECT, INDEX, OFFSET, 这三个函数,是你要想学excel函数,估计你肯定过的关。 在论坛里看帖子,有一点比较累,很多都是直接用excel文件里做说明,你需要下载文件。我这里就全部用图来说明。 不过二级菜单的第一级的做法,都是相同的,大家可以参考上面的文章创建一个一级菜单。 第一种做法:使用函数INDIRECT 看看例子 很明显,我们希望在一级选择机房故障,那么2级就出现他下面的列表。 要实现这个目标并不复杂。 1:建立“名称 3个一级选项,我们需要建立3个“名称”:机房故障线路故障用户端故障。
竭诚为您提供优质文档/双击可除excel表格下拉公式怎么做 篇一:在excel中制作下拉列表的几种方法 下拉列表在excel中的用途十分广泛。在excel中制作下拉列表可以通过数据有效性、使用窗体控件和Vba控件工具箱中的组合框来制作。下面我们用一个具体的例子来进行说明(在文章结尾处可下载xls格式的示例文件)。假如我们每个月都有一个工资表,其中每个员工的工资按照其出勤天数每个月都不相同。 我们需要制作一个“个人工资表”来查看每个人每个月的工资情况,这时就可以制作一个包含员工姓名下拉列表,在其中进行选择来查看指定员工每个月的工资情况。 方法一:使用数据有效性 通过数据有效性可以在单元格中提供一个下拉箭头,单击下拉箭头会弹出下拉列表。因为员工姓名都在每月的工资表中,而“个人工资表”中没有这些人员姓名,所以我们必需先定义名称,以便在“个人工资表”中设置数据有效性时进行引用。 定义名称的方法是单击菜单“插入→名称”,在定义名
称对话框中进行定义,这里将“1月工资”表中的姓名区域b3:b14定义为“姓名”,如图。 1.假如下拉列表放在“个人工资表”的c1单元格,选择c1单元格,然后单击菜单“数据→有效性”,选择“设置”选项卡,在“有效性条件”区域中“允许”下方的下拉列表中选择“序列”。 2.在“来源”下方的文本框中输入“=姓名”。单击“确定”。 3.在数据区c3:h14中用Vlookup函数对工资数据进行关联。例如第3行为1月工资,可以在c3单元格中输入公式 =Vlookup($c$1,1月工资!$b$3:$h$14,2,0)” 在d3单元格中输入公式: =Vlookup($c$1,1月工资!$b$3:$h$14,3,0) 在c4单元格中输入公式: =Vlookup($c$1,2月工资!$b$3:$h$14,2,0) 其余单元格依此类推。这样,只要在单击c1单元格右侧的下拉箭头选择员工姓名就可以查看其所有月份的工资情况。 方法二:用窗体控件 1.在菜单栏上右击,在弹出的菜单中选择“窗体”,将弹出“窗体”浮动工具栏,单击“组合框”控件。
一、直接输入: 1.选择要设置的单元格,譬如A1单元格; 2.选择菜单栏的“数据”→“有效性”→出现“数据有效性”弹出窗口; 3.在“设置”选项中→“有效性条件”→“允许”中选择“序列”→右边的“忽略空值”和“提供下拉菜单”全部打勾→在“来源”下面输入数据,譬如“1,2,3,4,5,6,7,8,9”(不包括双引号,分割符号“,”必须为半角模式→按“确定”就OK了,再次选择该A1单元格,就出现了下拉菜单。 二、引用同一工作表内的数据: 如果同一工作表的某列就是下拉菜单想要的数据,譬如引用工作表Sheet1的B2:B5,B2:B5分别有以下数据:1、2、3、4,操作如下: 1.选择要设置的单元格,譬如A1单元格; 2.选择菜单栏的“数据”→“有效性”→出现“数据有效性”弹出窗口; 3.在“设置”选项中→“有效性条件”→“允许”中选择“序列”→右边的“忽略空值”和“提供下拉菜单”全部打勾→在“来源”下面输入数据“=$B$2:$B$5”,也可以按右边带红色箭头的直接选择B2:B5区域→按“确定”就OK了,再次选择该A1单元格,就出现了下拉菜单。 三、引用不同工作表内的数据(必须用到定义名称): 如果不同工作表的某列就是下拉菜单想要的数据,譬如工作表Sheet1的A1单元格要引用工作表Sheet2的B2:B5区域,工作表Sheet2的B2:B5分别有以下数据:1、2、3、4,操作如下: 1.定义名称:菜单栏→“插入”→“名称”→“定义”→弹出“定义名称”窗口,在“在当前工作薄中的名称”下面输入“DW”(可以自己随便明明)→“引用位置”下面输入“=Sheet2!$B$2:$B$5”,也可以按右边带红色箭头的直接选择B2:B5区域→按“添加”后再按“确定”完成第一步。 2.选择菜单栏的“数据”→“有效性”→出现“数据有效性”弹出窗口; 3.在“设置”选项中→“有效性条件”→“允许”中选择“序列”→右边的“忽略空值”和“提供下拉菜单”全部打勾→在“来源”下面输入“=DW”,“DW”就是刚刚定义好的名称,按“确定”就OK了,再次选择该A1单元格,就出现了下拉菜单。
Excel中制作多级下拉菜单方法 多级选择录入 在许多信息系统的单据录入界面中,都有多极选择的功能,即先选择录入某大项,然后选择录入属于此大项的小项。这是一项非常实用的功能,能够有效避免串项和项目混乱,在EXCEL中,利用数据有效性能够很容易地实现单级的选择录入,如果配合名称和公式,也能够实现两级和两级以上的选择性录入效果。 在如图所示的工作表"城市列表"中,A列~G列保存了一份中国行政区域资料,记录了部分省份的城市清单。现在希望自爱"多级选择"工作表中实现对省份和城市的选择性录入效果,要求可以先选择录入省份,然后选择录入该省份所有城市。 第一步:按
第二步:单击工作表标签以切换到"多级选择"工作表。 第三步:单击A2并拖动光标A11以选定区域A2:A11。 第四步:单击菜单"数据"-"有效性",在"数据有效性"对话框的"设置"选项卡中,在"允许"下拉列表框中选择"序列"项。 第五步:在"来源"框中输入=Provinve。 第六步:勾选"忽略空值"复选框和"提供下拉箭头"复选框,单击"确定"按钮,关闭"数据有效性"对话框。 第七步:单击B2并拖动光标到B11以选定区域B2:B11。 第八步:单击菜单"数据"-"有效性",在"数据有效性"对话框的"设置"选项卡中,在"允许"下拉列表框中选择"序列"项。 第九步:在来源框中输入:=OFFSET(City,,MATCH($A2,Probince,)-1,COUNTA(OFFSET(City,,MATCH($A2,Province,)-1,65535))) (公式中的逗号都为半角逗号) 第十步:勾选"忽略空值"复选框和"提供下拉箭头"复选框,单击"确定"按钮,关闭"数据有效性"对话框。 如此设置完成以后,就能够实现多级选择录入的效果了。 参考资料:https://www.sodocs.net/doc/243660023.html,/114996047.html
一、Excel表格中如何制作下拉式菜单? 我看到一个Excel表格中有一行都有一个下拉式菜单,以供选择合条件的,不知如何制作?我在Excel软件找了很久都没找到有这种功能,哪位朋友能告诉我吗? 最佳答案 选中一个单元格,然后点数据有效性,允许那一栏中选序列,然后在下边的格中 填入你要选择的条,例如,男,女,两性人,确定,注意,选项中间用英文方式下的逗号分隔。 这样,你刚才选中的单元格就会出现一个小选项按钮,是一个小黑三角,点一下 就会出现男,女,两性人三个选项。 二、表格制作中那种下拉式菜单怎么弄,具体点,还有表格下方的那种几个表格叠加起来的,比如1月、2月、。。。 最佳答案 下拉菜单: 1、选择数据选项卡 2、选择数据有效性 3、在弹出的对话框中选“设置”选项卡 4、在“允许”下选“序列” 5、在“来源”中输入相关的文字,用英文状态的逗号隔开,如1月,2月,3月······ 如你图中所示那种: 在你的Excel表下面有很多个sheet,你双击一个,就可以重命名,这个时候输入你想要命名的文字就行,如果要新建的话可以点击最后一个新建sheet的按钮或者,点鼠标右键,选择插入,都可以~
一、建立分类下拉列表填充项 我们常常要将企业的名称输入到表格中,为了保持名称的一致性,利用“数据有效性”功能建了一个分类下拉列表填充项。 1.在Sheet2中,将企业名称按类别(如“工业企业”、“商业企业”、“个体企业”等)分别输入不同列中,建立一个企业名称数据库。 2.选中A列(“工业企业”名称所在列),在“名称”栏内,输入“工业企业”字符后,按“回车”键进行确认。 仿照上面的操作,将B、C……列分别命名为“商业企业”、“个体企业”…… 3.切换到Sheet1中,选中需要输入“企业类别”的列(如C列),执行“数据→有效性”命令,打开“数据有效性”对话框。在“设置”标签中,单击“允许”右侧的下拉按钮,选中“序列”选项,在下面的“来源”方框中,输入“工业企业”,“商业企业”,“个体企业”……序列(各元素之间用英文逗号隔开),确定退出。 再选中需要输入企业名称的列(如D列),再打开“数据有效性”对话框,选中“序列”选项后,在“来源”方框中输入公式:=INDIRECT(C1),确定退出。 4.选中C列任意单元格(如C4),单击右侧下拉按钮,选择相应的“企业类别”填入单元格中。然后选中该单元格对应的D列单元格(如D4),单击下拉按钮,即可从相应类别的企业名称列表中选择需要的企业名称填入该单元格中。 提示:在以后打印报表时,如果不需要打印“企业类别”列,可以选中该列,右击鼠标,选“隐藏”选项,将该列隐藏起来即可。